1.rabbitMQ配置就不说了,springboot提供傻瓜式配置。
2.
(1).配置config
@Configuration
public class MQConfig {
/**
* Direct模式 交换机Exchange
* 只要有一个新的类型的队列,就需要添加一条
*/
@Bean
public Queue smsQueue() {
return new Queue(MqBean.SMS_QUEUE, true);
}
@Bean
public Queue auctionQueue() {
return new Queue(MqBean.AUCTION_END_QUEUE, true);
}
@Bean
public Queue goodsOrderRefundQueue() {
return new Queue(MqBean.GOODS_ORDER_REFUND_QUEUE, true);
}
@Bean
public Queue expOrderRefundQueue() {
return new Queue(MqBean.EXP_ORDER_REFUND_QUEUE, true);
}
@Bean
public Queue auctionOrderRefundQueue() {
return new Queue(MqBean.AUCTION_ORDER_REFUND_QUEUE, true);
}
@Bean
public Queue auctionBondRefundQueue() {
return new Queue(MqBean.AUCTION_BOND_REFUND_QUEUE, true);
}
/**
* 死信队列跟交换机类型没有关系 不影响该类型交换机的特性.
* 死信处理原理:
*
* 没有消费者监听所以当消息的过期时间到了之后被死信队列投递路由到之前设置好的转发队列
*/
@Bean
DirectExchange deadLetterExchange(){
return new DirectExchange(MqBean.ORDER_DEAD_EXCHANGE_NAME);
}
/**
* 声明一个死信队列.
* x-dead-letter-exchange 对应死信交换机转发交换机名
* x-dead-letter-routing-key 对应死信队列转发路由名
*/
@Bean
Queue deadLetterQueue(){
Map<String, Object> map = new HashMap<String, Object>(2);
map.put("x-dead-letter-exchange",MqBean.ORDER_DEAD_EXCHANGE_NAME);
map.put("x-dead-letter-routing-key",MqBean.REDIRECT_ROUTING_KEY);
return new Queue(MqBean.ORDER_DEAD_QUEUE,true,false,false,map);
}
/**
* 定义死信队列转发队列.
*/
@Bean
public Queue redirectQueue() {
return new Queue(MqBean.ORDER_REDIRECT_QUEUE);
}
/**
* 死信路由通过 DL_KEY 绑定键绑定到死信队列上.
*/
@Bean
public Binding deadLetterBinding(){
return new Binding(MqBean.ORDER_DEAD_QUEUE,Binding.DestinationType.QUEUE,MqBean.ORDER_DEAD_EXCHANGE_NAME,MqBean.DEAD_LETTER_ROUTING_KEY,null);
}
@Bean
public Binding redirectBinding(){
return new Binding(MqBean.ORDER_REDIRECT_QUEUE,Binding.DestinationType.QUEUE,MqBean.ORDER_DEAD_EXCHANGE_NAME,MqBean.REDIRECT_ROUTING_KEY,null);
}
}
3. 生产者
private static final Long TEST_DEAD_TIME = 60000L;
@Override
public void sendDeadQueue(String queue, String ldKey, Map<String, Object> param) {
MessagePostProcessor messagePostProcessor = new MessagePostProcessor() {
@Override
public Message postProcessMessage(Message message) throws AmqpException {
MessageProperties messageProperties = message.getMessageProperties();
messageProperties.setContentEncoding("utf-8");
/*messageProperties.setExpiration(String.valueOf(DEAD_TIME));*/
messageProperties.setExpiration(String.valueOf(TEST_DEAD_TIME));
return message;
}
};
log.info("======>进入订单死信预处理队列<====="+new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()));
amqpTemplate.convertAndSend(queue, ldKey, param,messagePostProcessor);
}
4.消费者
@RabbitListener(queues = MqBean.ORDER_REDIRECT_QUEUE)
public void OrderEndQueue(Map<String, Object> param){
log.info("=========>死信队列接收时间:"+new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()) +"<=========");
String orderNo = String.valueOf(param.get("orderNo"));
log.info("=====================>死信队列处理完毕订单号:==============>"+orderNo);
}