【问题标题】:Re-queue Amqp message at tail of Queue在队列尾部重新排队 Amqp 消息
【发布时间】:2013-10-14 16:11:20
【问题描述】:

我有一个使用 Spring 和 RabbitMQ 的项目设置。目前,我的应用程序可能会接收到无法处理的 amqp 消息,直到另一个异步进程完成(遗留和完全分离,我无法控制)。所以结果是我可能不得不等待处理消息一段时间。这样做的结果是变压器中的异常。

当消息被 NACK 回复到 rabbitMQ 时,它会将其放回队列的头部并立即重新拉取它。如果我收到的无法处理的消息等于并发侦听器的数量,我的工作流程就会锁定。它旋转它的轮子等待消息变得可处理,即使队列中有有效的可处理消息在等待。

有没有办法拒绝和 amqp 消息并让它回到队列的尾部?根据我的研究,rabbitMQ 曾经以这种方式工作,但现在我似乎只排在队列的首位。

我的配置相当简单,但为了保持连续性...

连接工厂是:org.springframework.amqp.rabbit.connection.CachingConnectionFactory RabbitMQ 3.1.1

Spring 集成:2.2.0

<si:channel id="channel"/>
<si-amqp:inbound-channel-adapter
    queue-names="commit" channel="channel" connection-factory="amqpConnectionFactory"
    acknowledge-mode="AUTO" concurrent-consumers="${listeners}"
    channel-transacted="true"
    transaction-manager="transactionManager"/>

<si:chain input-channel="channel" output-channel="nullChannel">
    <si:transformer ref="transformer"></si:transformer>
    <si:service-activator ref="activator"/>
</si:chain>

【问题讨论】:

    标签: rabbitmq spring-integration


    【解决方案1】:

    你是正确的,RabbitMQ 前段时间已更改。 API 中没有任何内容可以改变行为。

    当然,您可以在入站适配器上放置一个error-channel,然后是一个转换器 (expression="payload.failedMessage"),然后是一个配置了适当的交换/路由键的出站适配器,以便在后面重新排队消息队列。

    您可能希望在错误流中添加一些额外的逻辑来检查异常类型 (payload.cause) 并决定您想要的操作。

    如果错误流本身抛出异常,原始消息将像以前一样在头部重新排队;如果正常退出,消息将被确认。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-13
      • 2017-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-23
      相关资源
      最近更新 更多