RabbitMQ 延迟队列

  • 创建步骤
 (1) 建死信交换器  order.timeout.dead.letter.exchange(Fanout)
  (2) 创建普通交换机 order.cancel.exchange (Fanout)
  (3) 创建普通队列   order.cancel.queue
 (4)创建订单延迟队列(死信队列) order.timeout.queue
  (5) 绑定普通交换机和队列
  (6) 将订单延迟队列绑定到交换机
  • 创建交换机和队列
package com.amz.source.track.config.rabbitmq.config;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author zj
 * @describe 延迟队列取消订单
 * (1) 建死信交换器  order.timeout.dead.letter.exchange(Fanout)
 *  (2) 创建普通交换机 order.cancel.exchange (Fanout)
 *  (3) 创建普通队列   order.cancel.queue
 * (4)创建订单延迟队列(死信队列) order.timeout.queue
 *  (5) 绑定普通交换机和队列
 *  (6) 将订单延迟队列绑定到交换机
 * @date 2020 2020/10/16 14:01
 */
@Configuration
public class CloseOrderRabbitMqConfig {
    /**
     * 死信交换机
     */
    public static final String ORDER_TIMEOUT_DEAL_LETTER_EXCHANGE = "order.timeout.dead.letter.exchange";
    /**
     * 超时/死信队列
     */
    public static final  String ORDER_TIMEOUT_QUEUE = "order.timeout.queue";
    /**
     * 取消订单交换机
     */
    public  static final String ORDER_CANCEL_EXCHANGE = "order.cancel.exchange";
    /**
     * 取消订单队列
     */
    public static final  String ORDER_CANCEL_QUEUE = "order.cancel.queue";
    /**
     * 创建死信交换机
     * @return
     */
    @Bean
    public FanoutExchange  orderTimeoutDeadLetterExchange() {
        return new FanoutExchange(ORDER_TIMEOUT_DEAL_LETTER_EXCHANGE);
    }
    /**
     * 创建取消订单交换机
     * @return
     */
    @Bean
    public FanoutExchange  orderCancelExchange() {
        return new FanoutExchange(ORDER_CANCEL_EXCHANGE);
    }
    /**
     * 创建取消订单队列
     * @return
     */
    @Bean
    public Queue orderCancelQueue() {
        return  new Queue(ORDER_CANCEL_QUEUE);
    }
    /**
     * 创建死信订单队列
     * @return
     */
    @Bean
    public Queue orderTimeOutQueue() {
        return  QueueBuilder
                //实例化的队列
                .durable(ORDER_TIMEOUT_QUEUE)
                //到期后转发的交换机
                .withArgument("x-dead-letter-exchange", ORDER_CANCEL_EXCHANGE)
                //到期后转发的路由键
                .withArgument("x-dead-letter-routing-key", ORDER_CANCEL_QUEUE)
                //队列延迟时间
                .withArgument("x-message-ttl", 5000)
                .build();
    }

    /**
     * 绑定死信交换机
     * @param orderTimeoutDeadLetterExchange
     * @param orderTimeOutQueue
     * @return
     */
    @Bean
    public Binding  orderTtlBinding(DirectExchange orderTimeoutDeadLetterExchange, Queue orderTimeOutQueue){
        return BindingBuilder
                .bind(orderTimeOutQueue)
                .to(orderTimeoutDeadLetterExchange)
                .with(ORDER_TIMEOUT_QUEUE);
    }
    /**
     * 将订单延迟队列绑定到交换机
     */
    @Bean
    Binding orderBinding(DirectExchange orderCancelExchange, Queue orderCancelQueue) {
        return BindingBuilder
                .bind(orderCancelQueue)
                .to(orderCancelExchange)
                .with(ORDER_CANCEL_QUEUE);
    }
}

  • 测试
@ApiOperation("测试MQ")
    @GetMapping("/testMQ")
    public void testMq(String str) {
        log.info("{}, 发送时间:{}", str, LocalDateTime.now());
        rabbitTemplate.convertAndSend(
                CloseOrderRabbitMqConfig.ORDER_TIMEOUT_DEAL_LETTER_EXCHANGE,
                CloseOrderRabbitMqConfig.ORDER_TIMEOUT_QUEUE,str);
        log.info("发送完成");
    }

    @RabbitListener(queues = CloseOrderRabbitMqConfig.ORDER_CANCEL_QUEUE)
    @RabbitHandler
    public void test(Message message, Channel channel, String str) throws IOException {
        log.info("{},接受时间:{}", str, LocalDateTime.now());
        log.info("message:{}", message.toString());
        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
    }
  • 测试结果
2020-10-16 15:08:37.074 【XNIO-1 task-3 INFO 】 c.a.s.t.c.web.MqTestDemoController -【】- ZJSD, 发送时间:2020-10-16T15:08:37.074
2020-10-16 15:08:37.075 【XNIO-1 task-3 INFO 】 c.a.s.t.c.web.MqTestDemoController -【】- 发送完成

2020-10-16 15:08:42.096 【org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1 INFO 】 c.a.s.t.c.web.MqTestDemoController -【】- ZJSD,接受时间:2020-10-16T15:08:42.096

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值