消息被队列丢弃后,会变成死信,如果队列不声明死信队列,那么这些消息将被永久丢弃。

Spring Cloud Stream 默认实现里面并没有配置死信队列的产生,在 spring-cloud-stream-binder-rabbit-core 这个包里面的 RabbitBindingPropertiesRabbitConsumerPropertiesRabbitProducerProperties 的几个配置对象,有着更详细的扩展配置,我们可以根据这里面的代码提示,进行如下的配置:

spring:
  # Rabbitmq 配置:RabbitProperties
  rabbitmq:
    # RabbitMQ主机地址。如果设置了address属性,则忽略。
    host: 192.168.3.20
    # RabbitMQ端口。如果设置了address属性,则忽略。默认为 5672,如果启用了SSL,则默认为5671。
    port: 5672
    # 访问broker进行身份验证的账号。默认为“guest”。
    username: admin
    # 访问broker进行身份验证的密码。默认为“guest”。
    password: admin
    # 连接到broker时要使用的虚拟主机。
    virtual-host: /
    # 消息发布确认方式,有三个可选值:SIMPLE、CORRELATED、NONE。默认为NONE。
    publisher-confirm-type: simple
    # 启动消息失败返回,只有设置为true时,消息路由失败才会触发Return回调
    publisher-returns: true
    # RabbitProperties.Template
    template:
      # 当exchange无法找到任何一个合适的queue时,将消息return给生产者
      mandatory: true
    # RabbitProperties.Listener
    listener:
      simple:
        #NONE:自动确认;AUTO:根据情况确认;MANUAL:手动确认
        acknowledge-mode: manual
      direct:
        #NONE:自动确认;AUTO:根据情况确认;MANUAL:手动确认
        acknowledge-mode: manual
  cloud:
    stream:
      #消费者总数
      instance-count: 2
      #当前消费者的索引
      instance-index: 0
      # 消息中间件绑定配置:BindingProperties
      bindings:
        sms-input:
          # 指定要使用的 Exchange 名称
          destination: ramq.sms.topic
          #设置消息类型
          content-type: application/json
          #设置消息的组名称(同名组中的多个消费者,只会有一个去消费消息.)
          group: group1
          # 消费者配置:ConsumerProperties
          consumer:
            # 开启分区支持
            partitioned: true
            # NONE:自动确认;AUTO:根据情况确认;MANUAL:手动确认
            acknowledge-mode: manual
      # 消息中间件配置:BinderProperties
      binders:
        defaultRabbit:
          type: rabbit
      # Rabbit 消息中间件专属配置:RabbitExtendedBindingProperties
      rabbit:
        # Rabbit消息中间件绑定配置:RabbitBindingProperties
        bindings:
          sms-input:
            # 消费者配置:RabbitCommonProperties,RabbitConsumerProperties
            consumer:
              #NONE:自动确认;AUTO:根据情况确认;MANUAL:手动确认
              acknowledge-mode: manual
              # 是否自动声明死信队列(DLQ)并将其绑定到死信交换机(DLX)。默认是false。当MQ消费失败达到最大重试次数就会把消息加入 死信队列 , 我们可以通过把死信队列中的消息再移动到 正常队列重复消费
              auto-bind-dlq: true
              # 默认 prefix + destination + group + .dlq。DLQ的名称。
              #dead-letter-queue-name: 'ramq.sms.topic.group1.dlx.dlq'
              # 默认 prefix + DLX。DLX的名称
              #dead-letter-exchange: 'DLX'
              # 默认 destination + group
              #dead-letter-routing-key: 'ramq.sms.topic.group1.dlx'
              # 队列所有 customer 下线, 且在过期时间段内 queue 没有被重新声明, 多久之后队列会被销毁, 注意, 不管队列内有没有消息. 默认不设置.
              dlq-expires: 30000
              # 是否声明为惰性队列(Lazy Queue).默认 false
              dlq-lazy: false
              # 队列中消息数量的最大限制. 默认不限制
              dlq-max-length: 100000
              # 队列所有消息总字节的最大限制. 默认不限制
              dlq-max-length-bytes: 100000000
              # 队列的消息可以设置的最大优先级. 默认不设置
              dlq-max-priority: 255
              # 队列的消息的过期时间. 默认不限制,如果设置,可能发生消息丢失
              #dlq-ttl: 1000000
              # 默认不做限制,即无限。消息在队列中最大的存活时间。当消息滞留超过ttl时,会被当成消费失败消息,即会被转发到死信队列或丢弃.
              ttl: 10000
              # 默认false。当为true时,死信队列接收到的消息的headers会更加丰富,多了异常信息和堆栈跟踪。
              republish-to-dlq: true
              # 默认DeliveryMode.PERSISTENT(持久化)。当republishToDlq为true时,转发的消息的delivery mode
              republish-delivery-mode: persistent
              #重新排队拒绝消息的简称失败的消息将重新提交给同一处理程序并连续循环
              requeue-rejected: true

作者:Jeebiz  创建时间:2023-04-04 12:03
最后编辑:Jeebiz  更新时间:2024-09-23 10:03