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

  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() {
         
        

你可能感兴趣的:(Java,rabbitmq,SpringBoot,交换机,队列,rabbitmq,queue,java)