1、需要用到插件 rabbitmq_delayed_message_exchange 来实现,插件下载地址:https://www.rabbitmq.com/community-plugins.html

2、下载后把插件放到 plugins 里面,然后到 sbin里面打开cmd,执行 rabbitmq-plugins enable rabbitmq_delayed_message_exchange 命令

3、插件装好后,重新启动mq,然后集成mq。

  首先,导包

    <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

  

  然后,配置文件配置连接信息:

spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.listener.simple.acknowledge-mode=manual

  

  mq 配置:

  

package com.rrg.gz.mq;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.CustomExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import java.util.HashMap;
import java.util.Map; /**
* mq配置
* @author huangsz 2019/4/25 0025
*/
@Configuration
public class RabbitPluginConfig { /**
* 延时队列交换机
* 注意这里的交换机类型:CustomExchange
* @return
*/
@Bean
public CustomExchange delayExchange(){
Map<String, Object> args = new HashMap<>();
args.put("x-delayed-type", "direct");
return new CustomExchange("rrg_delay_exchange","x-delayed-message",true, false,args);
} /**
* 延时队列
* @return
*/
@Bean
public Queue delayQueue(){
return new Queue("rrg_delay_queue",true);
} /**
* 给延时队列绑定交换机
* @return
*/
@Bean
public Binding cfgDelayBinding(Queue cfgDelayQueue, CustomExchange cfgUserDelayExchange){
return BindingBuilder.bind(cfgDelayQueue).to(cfgUserDelayExchange).with("rrg_delay_key").noargs();
}
}

  发送消息类、接收类和信息类,信息类是我们自己时间业务封装需要消费的信息。

package com.rrg.gz.mq;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; /**
* 消息发送者
*
* @author huangsz 2019/3/7 0007
*/
@Component
public class Sender {
private static Logger log = LoggerFactory.getLogger(Sender.class); @Autowired
private RabbitTemplate rabbitTemplate; public void sendDelayMessage(MqEntity entity, long time) {
// 这里的消息可以是任意对象,无需额外配置,直接传即可
log.info("延时队列生产消息");
this.rabbitTemplate.convertAndSend(
"rrg_delay_exchange",
"rrg_delay_key",
entity,
message -> {
// 注意这里时间可以使long,而且是设置header
message.getMessageProperties().setHeader("x-delay",time);
return message;
}
);
log.info("{}ms后执行", time);
} }
package com.rrg.gz.mq;

import com.rabbitmq.client.Channel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; /**
* 接受者
*
* @author huangsz 2019/3/7 0007
*/ @Component
public class Receiver {
private static Logger log = LoggerFactory.getLogger(Receiver.class);
@Autowired
private Sender sender; @RabbitListener(queues = "rrg_delay_queue")
public void cfgUserReceiveDealy(MqEntity entity, Message message, Channel channel) throws Exception{
log.info("开始接受消息!");
// 通知 MQ 消息已被接收,可以ACK(从队列中删除)了
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
System.out.println("接收消息并打印");
System.out.println(entity);
}
}
package com.rrg.gz.mq;

import java.io.Serializable;

/**
* 一定要实现 Serializable
* @author huangsz 2019/3/7 0007
*/
public class MqEntity implements Serializable { private Integer userId;
private String msg; public MqEntity() {
} public MqEntity(Integer userId, String msg) {
this.userId = userId;
this.msg = msg;
} public Integer getUserId() {
return userId;
} public void setUserId(Integer userId) {
this.userId = userId;
} public String getMsg() {
return msg;
} public void setMsg(String msg) {
this.msg = msg;
} @Override
public String toString() {
return "MqEntity{" +
"userId=" + userId +
", msg='" + msg + '\'' +
'}';
}
}

4、写一个controller测试:

  

@RequestMapping("/test1")
public void test(){
MqEntity mqEntity = new MqEntity(1,"30秒后消费");
sender.sendDelayMessage(mqEntity,30000);
} @RequestMapping("/test2")
public void test2(){
MqEntity mqEntity = new MqEntity(1,"10秒后消费");
sender.sendDelayMessage(mqEntity,10000);
}

先执行test1,然后执行test2,这个时候,不需要等test1消费完之后,test2才消费信息。

Rabbitmq 实现延时任务的更多相关文章

  1. RabbitMQ实现延时消息的两种方法

    目录 RabbitMQ实现延时消息的两种方法 1.死信队列 1.1消息什么时候变为死信(dead-letter) 1.2死信队列的原理 1.3 代码实现 1.4死信队列的一个小坑 2 .延时插件 2. ...

  2. rabbitmq实现延时队列(死信队列)

    基于队列和基于消息的TTL TTL是time to live 的简称,顾名思义指的是消息的存活时间.rabbitMq可以从两种维度设置消息过期时间,分别是队列和消息本身. 队列消息过期时间-Per-Q ...

  3. spring boot Rabbitmq集成,延时消息队列实现

    本篇主要记录Spring boot 集成Rabbitmq,分为两部分, 第一部分为创建普通消息队列, 第二部分为延时消息队列实现: spring boot提供对mq消息队列支持amqp相关包,引入即可 ...

  4. 基于rabbitMQ 消息延时队列方案 模拟电商超时未支付订单处理场景

    前言 传统处理超时订单 采取定时任务轮训数据库订单,并且批量处理.其弊端也是显而易见的:对服务器.数据库性会有很大的要求,并且当处理大量订单起来会很力不从心,而且实时性也不是特别好 当然传统的手法还可 ...

  5. springboot使用RabbitMQ实现延时任务

    延时队列顾名思义,即放置在该队列里面的消息是不需要立即消费的,而是等待一段时间之后取出消费.那么,为什么需要延迟消费呢?我们来看以下的场景 订单业务: 在电商/点餐中,都有下单后 30 分钟内没有付款 ...

  6. rabbitMq实现延时队列

    原文:https://my.oschina.net/u/3266761/blog/1926588 rabbitMq是受欢迎的消息中间件之一,相比其他的消息中间件,具有高并发的特性(天生具备高并发高可用 ...

  7. RabbitMq 实现延时队列-Springboot版本

    rabbitmq本身没有实现延时队列,但是可以通过死信队列机制,自己实现延时队列: 原理:当队列中的消息超时成为死信后,会把消息死信重新发送到配置好的交换机中,然后分发到真实的消费队列: 步骤: 1. ...

  8. Rabbitmq的延时队列的使用

    配置: spring: rabbitmq: addresses: connection-timeout: username: guest password: guest publisher-confi ...

  9. RabbitMQ及延时队列

    一.简介 我用过RabbirMQ的发布订阅模式,以及一对一的延迟队列. 1.RabbitMQ的有消息确认机制,消费一条则队列中少一条,也有对应的消费到消息及认为是消费成功这样的模式,一般使用前者. 发 ...

随机推荐

  1. Django restful framework中自动生成API文档

    自动生成api文档(不管是函数视图还是类视图都能显示) 1.安装rest_framework_swagger库 pip install django-rest-swagger 2.在项目下的 urls ...

  2. C++教程详解

    第一篇:基础篇 简介.环境配置.基本语法.注释.数据类型.变量类型.变量作用域.常量.修饰符类型. 存储类.运算符.循环.判断.函数.数字.数组.字符串.指针.引用.日期&时间. 基本的输入输 ...

  3. 在windows环境下部署nuxt项目(线上发布部署)

    因为公司项目需要兼容SEO,同时我们也一直希望能够真正的实现前后端分离,于是毫不犹豫的选择了nuxt. 话说要重构前后端分离真是一个大工程,由于各种原因我们团队花了近两年时间都没有完成,最近才又重启把 ...

  4. [开源] FreeSql 配套工具,基于 Razor 模板实现最高兼容的生成器

    FreeSql 经过半年的开发和坚持维护,在 0.6.x 版本中完成了几大重要事件: 1.按小包拆分,每个数据库实现为单独 dll: 2.实现 .net framework 4.5 支持: 3.同时支 ...

  5. linux--新装机图形化界面遇到的问题

    1 许可证信息 q 退出 c 继续 r 刷新 按以下顺序正确输入即可: 1  ------  2 -----  q  -----  yes

  6. MySQL下载和安装教程

    1.下载MySQL数据库可以访问官方网站:https://www.mysql.com/ 2.点击DOWNLOADS模块下的Community模块下的MySQL Community Server进行下载 ...

  7. 《转》crontab 定时任务

    命令格式 crontab [-u user] file crontab [-u user] [-e | -l | -r | -i ] 命令参数 -u user:用来设定某个用户的crontab服务,例 ...

  8. 关于 ASP.NET Core 中的 RazorPages

    Contact.cshtml @page @model ContactModel @{ ViewData["Title"] = "Contact"; } < ...

  9. bash / powershell切换到脚本所在目录

    切换工作目录到脚本所在目录 bash: #!/usr/bin/env sh cd $(dirname $0) #cd $(dirname $(readlink $0)) #soft link powe ...

  10. ASP.NET Core基于K8S的微服务电商案例实践--学习笔记

    摘要 一个完整的电商项目微服务的实践过程,从选型.业务设计.架构设计到开发过程管理.以及上线运维的完整过程总结与剖析. 讲师介绍 产品需求介绍 纯线上商城 线上线下一体化 跨行业 跨商业模式 从0开始 ...