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);
}