Rabbitmq 在队列末尾重新排队Amqp消息

Rabbitmq 在队列末尾重新排队Amqp消息,rabbitmq,spring-integration,Rabbitmq,Spring Integration,我有一个使用Spring和RabbitMQ的项目设置。目前,我的应用程序可能会收到一条amqp消息,该消息在另一个异步进程完成之前无法处理(遗留和完全分离,我无法控制)。因此,结果是我可能不得不等待处理消息一段时间。其结果是变压器中出现异常 当消息被NACK回rabbitMQ时,它会将其放回队列的头部,并立即重新拉入队列。如果我收到与并发侦听器数量相等的无法处理的消息,我的工作流将被锁定。它旋转轮子等待消息变得可处理,即使队列中有有效的可处理消息在后面等待 有没有办法拒绝和amqp消息,让它返回

我有一个使用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,这是正确的。API中没有任何内容可以更改行为

当然,您可以在入站适配器上放置一个
错误通道
,然后是一个转换器(
expression=“payload.failedMessage”
),然后是一个配置了适当的交换/路由密钥的出站适配器,以在队列后面重新查询消息

您可能希望在错误流中添加一些附加逻辑,以检查异常类型(
payload.cause
),并决定要执行的操作

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