(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