最大尝试后,在队列尾部重新排队兔子AMQP消息

Den*_*tti 4 spring amqp rabbitmq spring-rabbit spring-amqp

我目前正在使用带弹簧的RabbitMQ(spring-rabbit-1.2.0-RELEASE),配置如下:

<rabbit:template id="amqpTemplate" connection-factory="connectionFactory"/>
<!-- Asynchronous exchanges -->
<!-- Admin -->
<rabbit:admin connection-factory="connectionFactory"/>

<!-- Error Handler -->
<bean id="biErrorHandler" class="my.project.sync.BiErrorHandler" />
<!-- Message converter -->
<bean id="biMessageConverter" class="my.project.sync.BiMessageConverter"/>

<bean id="retryInterceptor" class="org.springframework.amqp.rabbit.config.StatefulRetryOperationsInterceptorFactoryBean">
    <property name="messageRecoverer" ref="rejectAndDontRequeueRecoverer"/>
    <property name="retryOperations" ref="retryTemplate" />
    <property name="messageKeyGenerator" ref="biKeyGenerator" />
</bean> 

<bean id="biKeyGenerator" class="my.project.sync.BiMessageKeyGenerator"/>
<bean id="rejectAndDontRequeueRecoverer" class="org.springframework.amqp.rabbit.retry.RejectAndDontRequeueRecoverer"/>

<bean id="retryTemplate" class="org.springframework.retry.support.RetryTemplate">
    <property name="backOffPolicy">
        <bean class="org.springframework.retry.backoff.ExponentialBackOffPolicy">
            <property name="initialInterval" value="3000" />
            <property name="maxInterval" value="30000" />
        </bean>     
    </property>
    <property name="retryPolicy">
        <bean class="org.springframework.retry.policy.SimpleRetryPolicy">
            <property name="maxAttempts" value="3" />
        </bean>     
    </property>
</bean>  

 <rabbit:queue id="biSynchronizationQueue" name="BI_SYNCHRONIZATION_QUEUE" durable="true" />
<rabbit:listener-container message-converter="biMessageConverter" concurrency="1" 
    connection-factory="connectionFactory"
    error-handler="biErrorHandler"
    advice-chain="retryInterceptor"
    acknowledge="auto">
    <rabbit:listener queues="BI_SYNCHRONIZATION_QUEUE" ref="biSynchronizationService" method="handleMessage"/>
</rabbit:listener-container>
Run Code Online (Sandbox Code Playgroud)

我想在第三次尝试后在队列的尾部重新排队消息.但我找不到一种方法来执行该操作.

有人有想法吗?

在此先感谢您的帮助.

Gar*_*ell 7

除了使用的RejectAndDontRequeueRecoverer,使用自定义MessageRecoverer使用一个RabbitTemplate将消息发送到队列的后面; 然后抛出一条AmqpRejectAndDontRequeueException消息将被拒绝.

您可以子类化RejectAndDontRequeueRecoverer,发送消息recover()然后调用super.recover()(这只是抛出异常).或者只是自己完成所有实现recover().

  • 仅供参考,我们在即将发布的1.3版本中添加了`RepublishMessageRecoverer`; 请参阅此处的最后一段:http://docs.spring.io/spring-amqp/docs/1.3.0.BUILD-SNAPSHOT/reference/html/amqp.html#async-listeners (3认同)
  • 没有太大的区别,真的,只是另一种选择.但是,有一些事情:1.重新发布的消息获得`x-exception-stacktrace`和`x-exception-message`标头.2.您可以根据消息内容路由到不同的交换/路由密钥(虽然这需要一些自定义编码 - 继承`RabbitTemplate`并覆盖`send(交换,密钥,消息)`).3.您可以进一步修改消息(使用相同的技术).4. .... 使用`DLE`,消息会在标题中转发一些特定于兔子的信息,但没有与失败相关的应用程序级信息. (2认同)