1.订单交换机、订单队列、死信交换机和死信队列。他们之间的连接关系如下
2.订单生成者代码(这里只做测试,不完成功能)
@Test
public void sendOrderMessage(){
Long orderId = 123L;
log.debug("订单生成时间为:{}", System.currentTimeMillis() / 1000);
rabbitTemplate.convertAndSend(MqConfig.ORDER_EXCHANGE, MqConfig.ORDER_KEY, orderId);
}
2.1.生成订单号
2.2.打印发送消息时间
2.3.发送消息
3.配置所有交换机和队列及其关系代码(测试,这里超时20秒订单队列就会把消息传递给死信交换机)
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class MqConfig {
// 订单交换机名称
public static final String ORDER_EXCHANGE = "order.direct";
// 订单队列名称
public static final String ORDER_QUEUE = "order.queue";
// 订单交换机key
public static final String ORDER_KEY = "order";
// 死信交换机名称
public static final String DELAY_EXCHANGE = "delay.direct";
// 死信队列名称
public static final String DELAY_QUEUE = "delay.queue";
// 订单交换机key
public static final String DELAY_KEY = "delay";
// 声明订单交换机
@Bean
public DirectExchange orderExchange(){
return new DirectExchange(ORDER_EXCHANGE);
}
// 声明死信交换机
@Bean
public DirectExchange delayExchange(){
return new DirectExchange(DELAY_EXCHANGE);
}
// 声明订单队列
@Bean
public Queue orderQueue(){
Map<String, Object> map = new HashMap<>();
//设置队列超时时间
map.put("x-message-ttl", 1000 * 20);
//设置死信队列交换机
map.put("x-dead-letter-exchange", DELAY_EXCHANGE);
//设置死信队列路由key
map.put("x-dead-letter-routing-key", DELAY_KEY);
return new Queue(ORDER_QUEUE,true,false,false, map);
}
// 声明死信队列
@Bean
public Queue delayQueue(){
return new Queue(DELAY_QUEUE, true);
}
// 订单交换机绑定订单队列
@Bean
public Binding orderBinding(Queue orderQueue, DirectExchange orderExchange){
return BindingBuilder.bind(orderQueue).to(orderExchange).with(ORDER_KEY);
}
// 死信交换机绑定死信队列
@Bean
public Binding delayBinding(Queue delayQueue, DirectExchange delayExchange){
return BindingBuilder.bind(delayQueue).to(delayExchange).with(DELAY_KEY);
}
}
4.消费者监听死信队列代码(这里只做测试,打印当前时间(单位为s)用与对比发送时间)
import com.example.rabbitmq.config.MqConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import java.util.Map;
@Slf4j
@Component
public class MqListener {
@RabbitListener(queues = MqConfig.DELAY_QUEUE)
public void listenOrder(Long orderId){
// TODO 判断订单是否已经完成
// 这里默认未完成
log.debug("订单{}超时取消,time:{}", orderId, System.currentTimeMillis() / 1000);
}
}
5.测试结果
5.1 生产者打印显示
5.2 消费者打印显示
5.3 结果显示,发送者和生成者显示结果刚好相差20s.