RabbitMQ Spring死信配置无效

3
以下是我使用的配置。没有错误的消息可以很好地从交换机传递到队列,由监听器接收并进行转换,非常好。对于有错误的消息,我想发生的是当我抛出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>

你能分享一下在哪里抛出 AmqpRejectAndDontRequeueException 吗? - Artem Bilan
@ArtemBilan 如果出现问题,我会从消费者“RabbitMQExampleConsumer”中抛出异常。为了测试,我确保每次都会抛出异常。 - Felix
很好。如果您将“fanout-exchange id =” fanoutExchange“”更改为“direct-exchange”,它对您的工作有什么影响? - Artem Bilan
1
尝试添加显式的 x-dead-letter-routing-key - 否则将使用与原始路由相同的键 - 并且对于扇出交换不需要路由键。 - Gary Russell
@GaryRussell,谢谢您解决了我的问题。您能否将其作为答案提交,以便我可以标记为正确答案? - Felix
@ArtemBilan 也谢谢你。结果发现两种解决方案都可行,一种是将队列名称设置为直接交换的路由键,另一种是将其作为扇形交换。 - Felix
1个回答

3
尝试添加显式的 x-dead-letter-routing-key,否则将使用与原路由相同的键 - 广播交换不需要路由键。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接