java-spring boot-rabbitMQ-死信隊列-訂單失效案例

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


}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章