消息中间件踩坑

消息中间件踩坑之旅(三)——RabbitMq延时任务处理

2019-01-26  本文已影响0人  简单DI年华

场景描述

如何实现?

因为博主知识浅薄,所以这里只提供两种简单的解决方案
方案一:使用延迟队列
用到知识:

死信队列 http://www.rabbitmq.com/dlx.html

过期时间TTL http://www.rabbitmq.com/ttl.html

image

一下代码基于SpringBoot

@Bean////订单首次存在的死信队列
public Queue TradeQueue() {
    Map<String,Object> map = new HashMap<>();
    map.put("x-dead-letter-exchange","DLXExchange");  //设置重新发送的转换器名
    map.put("x-message-ttl",6000);//毫秒为单位          //过期时间
    return new Queue("TradeQueue",true,false,false,map);
}
@Bean//订单在死信队列过期后去的队列
public Queue DLXQueue() {
    Map<String,Object> map = new HashMap<>();
    return new Queue("DLXQueue",true,false,false,map);
}
//两个转换器声明
@Bean
DirectExchange TradeExchange() {
    DirectExchange exchange = new DirectExchange("TradeExchange", true, false);
    return exchange;
}

@Bean
FanoutExchange DLXExchange() {
    return new FanoutExchange("DLXExchange",true, false);
}
@Bean//订单首次存在的死信队列交换器绑定
Binding bindingExchangeMessage1(Queue TradeQueue, DirectExchange TradeExchange) {
    return BindingBuilder.bind(TradeQueue).to(TradeExchange).with("trade");
}

@Bean//订单首次存在的死信队列出来后经过的交换器绑定
Binding bindingExchangeMessage2(Queue DLXQueue, FanoutExchange DLXExchange) {
    return BindingBuilder.bind(DLXQueue).to(DLXExchange);
}
@Autowired
private AmqpTemplate rabbitTemplate;

public void send() {
    //测试发送
    //订单号
    int tradeId = 9518;
    //发送单号去死信队列做延时操作
   rabbitTemplate.convertAndSend("TradeExchange","trade",tradeId);
    System.out.println(new Date()+"---成功发送订单号到死信队列");

}
@RabbitListener(queues = "DLXQueue")    //接收来到DLXQueue的消息,及时TradeQueue过期后传来的消息,然后进行处理
public void process2(int str) {
    System.out.println("Receiver  : " +str);
    System.out.println(new Date()+"---成功接收已经过期订单号");
    System.out.println("处理操作。。。。。");

}

运行结果 时间相差和之前设置的一样,从而达到效果

      Mon Jan 21 00:51:03 CST 2019---成功发送订单号到死信队列
      Receiver  : 9518
      Mon Jan 21 00:51:09 CST 2019---成功接收已经过期订单号
      处理操作。。。。。

剩下一种方案 后续更新 是采用

Map<String, Object> args = new HashMap<>();
args.put("x-delayed-type", "direct");
///。。。。。
 message.getMessageProperties().setDelay(3000);   // 毫秒为单位,指定此消息的延时时长
上一篇下一篇

猜你喜欢

热点阅读