java-spring boot-rabbitMQ-死信队列-订单失效案例

1 篇文章 0 订阅
1 篇文章 0 订阅

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


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值