SpringBoot集成RabbitMQ实现消息重试机制,消息重试3次失败后写入死信队列,消息重试3次失败后入库

本文介绍了如何在SpringBoot应用中集成RabbitMQ,设置消息重试机制,当消息重试3次失败后将其放入死信队列,并在3次重试失败后将消息存入数据库。配置包括yml文件,RabbitConfig配置,消息实体定义,生产者和消费者实现。通过控制器和Postman进行测试,观察控制台输出及数据库变更。
摘要由CSDN通过智能技术生成
  1. yml配置

    spring:
      rabbitmq:
        username: admin
        password: admin
        host: localhost
        port: 5672
        virtual-host: /
        publisher-confirm: true #发布确认 开启confirms回调 Producer -> Exchange
        publisher-returns: true #发布返回 开启returnedMessage回调 Exchange -> Queue
        listener:
          type: simple
          simple:
            acknowledge-mode: manual #消费端收到消息后的确认方式 manual手动确认  none自动确认
            prefetch: 1 #消费者预取1条数据到内存
            default-requeue-rejected: false  #决定被拒绝的消息是否重新入队。默认值为true,需要手动basicNack时这些参数谅失效了
            retry:
              enabled: true  #开启消费者 程序异常情况下会进行重试
              max-attempts: 3 #重试次数
              initial-interval: 2000 #消费者重试间隔次数 2s
    
  2. RabbitConfig

    @Autowired
    private CachingConnectionFactory connectionFactory;
    
    /**
     * rabbitTemplate
     * @return
     */
    @Bean
    public RabbitTemplate rabbitTemplate() {
         
        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        rabbitTemplate.setMessageConverter(converter());
        //消息是否成功发送到Exchange
        rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {
         
            if (ack) {
         
                log.info("消息成功发送至Exchange");
            } else {
         
                log.info("消息发送到Exchange失败, {}, cause: {}", correlationData, cause);
            }
        });
        //触发setReturnCallback回调必须设置mandatory=true, 否则Exchange没有找到Queue就会丢弃掉消息, 而不会触发回调
        rabbitTemplate.setMandatory(true);
        //失败回调 消息是否从Exchange路由到Queue (只有消息从Exchange路由到Queue失败才会回调这个方法)
        rabbitTemplate.setReturnsCallback(returned ->
                log.info("消息从Exchange路由到Queue失败: exchange: {}, route: {}, replyCode: {}, replyText: {}, message: {}", returned.getExchange(), returned.getRoutingKey(), returned.getReplyCode(), returned.getReplyText(), returned.getMessage())
        );
        return rabbitTemplate;
    }
    
    @Bean
    public Jackson2JsonMessageConverter converter() {
         
        return new Jackson2JsonMessageConverter();
    }
    
    /**
     * 普通队列交换机
     */
    @Bean
    public FanoutExchange testFanoutExchange() {
         
        
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值