我使用Spring和RabbitMQ进行项目设置。目前,我的应用程序可能会收到一个amqp消息,该消息在另一个异步进程完成之前无法处理(遗留和完全分离,我无法控制)。所以结果是我可能要等待处理一段时间的消息。结果是变压器中的异常。
当消息被NACK回到rabbitMQ时,它会将其重新放回队列的头部并立即重新拉动它。如果我得到的不可处理的消息等于我的工作流锁定的并发侦听器的数量。即使在队列中等待有效的可处理消息,它也会轮转其轮子,等待消息变为可处理。
有没有办法拒绝和amqp消息,让它回到队列的尾部而不是?根据我的研究,rabbitMQ一次以这种方式工作,但现在我似乎只是排队了。
我的配置相当简单,但为了连续性,它是......
连接工厂是:org.springframework.amqp.rabbit.connection.CachingConnectionFactory RabbitMQ 3.1.1
Spring Integration: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>
答案 0 :(得分:0)
你说RabbitMQ前段时间改了是对的。 API中没有任何内容可以改变行为。
当然,您可以在入站适配器上放置error-channel
,然后是变换器(expression="payload.failedMessage"
),然后是配置了适当的交换/路由密钥的出站适配器以重新排队队列后面的消息。
您可能希望在错误流中添加一些额外的逻辑来检查异常类型(payload.cause
)并确定您想要的操作。
如果错误流本身抛出异常,原始消息将像以前一样在头部重新排队;如果它正常退出,则会收到消息。