当前位置: 首页 > 知识库问答 >
问题:

RabbitMQSpring死信配置不工作

顾琛
2023-03-14

下面是我正在使用的配置。消息没有错误,从exchange到队列都可以正常工作,并且侦听器可以进行转换,这很好。对于错误消息,我希望发生的是,当我抛出AmqpRejectAndDontRequeueException时,“rabbitQueue”将消息转发到死信交换,并最终进入“rabbitErrorQueue”但死信交换或队列上没有任何活动。有人知道我做错了什么吗?

    <beans
       xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:rabbit="http://www.springframework.org/schema/rabbit"
       xsi:schemaLocation="http://www.springframework.org/schema/rabbit
       http://www.springframework.org/schema/rabbit/spring-rabbit.xsd
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="clientConnectionFactory"
          class="org.springframework.amqp.rabbit.connection.RabbitConnectionFactoryBean">
    </bean>

    <rabbit:connection-factory
            id="rabbitConnectionFactory"
            connection-factory="clientConnectionFactory"
            host="${rabbit.broker.url}"
            port="${rabbit.broker.port}"
            username="${rabbit.username}"
            password="${rabbit.password}"
            publisher-confirms="true"/>

    <rabbit:admin connection-factory="rabbitConnectionFactory" />

    <rabbit:template id="rabbitTemplate"
                     connection-factory="rabbitConnectionFactory"
                     exchange="${rabbit.exchange.name}"
                     message-converter="messageConverter"
                     queue="${rabbit.queue.name}" >
    </rabbit:template>


    <rabbit:queue id="rabbitQueue" name="${rabbit.queue.name}" >
        <rabbit:queue-arguments>
            <entry key="x-dead-letter-exchange" value="${rabbit.dead.letter.exchange.name}"/>
            <entry key="x-message-ttl" value="10000" value-type="java.lang.Long"/>
        </rabbit:queue-arguments>
    </rabbit:queue>

    <rabbit:queue id="rabbitErrorQueue" name="${rabbit.dead.letter.queue.name}" />

    <rabbit:fanout-exchange id="fanoutExchange" name="${rabbit.exchange.name}">
        <rabbit:bindings>
            <rabbit:binding queue="rabbitQueue" />
        </rabbit:bindings>
    </rabbit:fanout-exchange>


    <rabbit:direct-exchange id="directErrorExchange" name="${rabbit.dead.letter.exchange.name}">
        <rabbit:bindings>
            <rabbit:binding key="${rabbit.queue.name}" queue="rabbitErrorQueue" />
        </rabbit:bindings>
    </rabbit:direct-exchange>

    <bean id="messageConverter" class="com.example.RabbitMQExampleEventMessageConverter"/>

    <bean id="rabbitMQExampleConsumer" class="com.example.consumer.RabbitMQExampleConsumer">
        <constructor-arg name="eventProcessor" ref="userEventProcessor" />
    </bean>

    <rabbit:listener-container connection-factory="rabbitConnectionFactory" message-converter="messageConverter">
        <rabbit:listener queues="${rabbit.queue.name}" ref="rabbitMQExampleConsumer" method="onMessage" />
    </rabbit:listener-container>
</beans>

共有1个答案

魏鸿
2023-03-14

尝试添加显式的x-dead-letter-routing-key,否则将使用与原始路由相同的密钥,并且扇出交换不需要路由密钥。

 类似资料:
  • 我有一个使用Spring Cloud Streams-RabbitMQ在微服务中交换消息的项目。对我的项目至关重要的一件事是,我不能丢失任何信息。 null 我是这些框架的新手,我希望你能帮助配置我的...

  • 我有一个现有的AWS Lambda(通过CloudFormation创建),现在我想修改它,使它有一个死信队列。本质上,这允许我重新配置Lambda,这样,如果它在执行期间无法处理/使用SQS消息,AWS将自动将消息发布到我选择的“死信队列”(DLQ)。 我一辈子都想不出该怎么加上: 我的Lambdas CF配置,如上面链接的文章所示。我能做的最接近的事情是: 在Lambdas主页上选择“管理此堆

  • 我有RabbitMQ的工作配置-使用TTL从等待(死信)的主队列中发送消息,并在到期时将其抛出: 对于应用程序中的Spring云流,我不能重复相同的方案。yml公司 我将非常感谢您在应用程序中提供的帮助和工作示例。yml公司

  • 我已经将lambda集成设置为具有固定保留并发的SQS,以限制对后端服务的请求。我需要使用DLQ来跟踪和存储错误。 使用SQS的ReDrive策略与lambda函数的DeadLetterConfig在行为上有什么不同? 我对队列中有大量消息但lambda并发性有限时的行为特别感兴趣。

  • 那是我学习Kafka的初期。我正在检查我本地机器中的每一个Kafka属性/概念。 所以我遇到了属性,下面是我的理解。如果我误解了什么,请纠正我。 将消息发送到主题后,必须将消息写入至少关注者数。 还包括引导。 如果可用活动代理的数量(间接地,在同步副本中)少于指定的,则生产者将引发发布消息失败的异常。 以下是我创建上述场景所遵循的步骤 在本地启动了3个代理,代理ID为0、1和2 创建了主题insy

  • 但就是不管用。我也试过在-d中使用这个选项,但这也不起作用。 谢谢你的帮助