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. zabbix 监控项报"Value "(No info could be read for "-p": geteuid()=1002 but you should be root"

    zabbix 监控项报错如下: “Value "(No info could be read for "-p": geteuid()=1002 but you shoul ...

  2. ASP.NET Core Identity 的示例

    1. appsettings.json { "ConnectionStrings": { "DefaultConnection": "Server=( ...

  3. WPF 解决多个TreeViewItem同时触发某事件的简单方法

    原理是: 因为是双击事件,也就是同时引发了选择事件,TreeViewItem的IsSelected为True.通过触发器设置某个属性为特殊值,然后在CS页面的双击事件方法内判断是否此值即可. xaml ...

  4. wp.editor.initialize 配置案例

    wp.editor.initialize ( 'EditorTextArea' , { tinymce: { wpautop: to true , theme: 'modern' , skin: 'l ...

  5. 如何在Mac上配置iTerm2以及给ITerm2配置lrzsz

    Mac安装ITerm2: https://www.jianshu.com/p/9c3439cc3bdb 给ITerm2配置lrzsz: https://www.cnblogs.com/sunshine ...

  6. Python【day 16-1】面向对象初识

    1.面向对象思想 1.面向过程 1.概念 按照事物的发展流程,第一步,第二步,第三步,一步步往下 2.优缺点 1.优点 简单,流水线式的 2.缺点 可扩展性差 2.面向对象 1.概念 对象:是属性和动 ...

  7. C#在循环中使用Random时生成的随机数相同的解决办法

    场景 在循环中使用 Random y = new Random(); 生成随机数时每次循环生成的数是一样的. ; i < ;i++ ) { Random y = new Random(); Po ...

  8. JavaWeb之Fliter & Listener

    Fliter & Listener Listener 监听器 作用 监听某一事件的发生.状态的改变. 监听器内部实现机制 接口回调 接口回调 A在执行循环,当循环到5的时候, 通知B. 事先先 ...

  9. 【面试突击】-RabbitMQ常见面试题(一)

    rabbit面试题1.什么是rabbitmq采用AMQP高级消息队列协议的一种消息队列技术,最大的特点就是消费并不需要确保提供方存在,实现了服务之间的高度解耦 2.为什么要使用rabbitmq1.在分 ...

  10. 一文解读DDD (转)

    从遇到问题开始 当人们要做一个软件系统时,一般总是因为遇到了什么问题,然后希望通过一个软件系统来解决. 比如,我是一家企业,然后我觉得我现在线下销售自己的产品还不够,我希望能够在线上也能销售自己的产品 ...