2013-10-07 142 views
0

我有一个使用Spring和RabbitMQ的项目设置。目前,我的应用程序可能会收到一个amqp消息,直到另一个异步过程完成(遗留的和完全分离的,我无法控制)才能被处理。所以结果是我可能不得不等待处理消息一段时间。这是变压器的一个例外。队列尾部重新排队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> 

回答

0

你是对的,RabbitMQ在前一段时间被改变了。 API中没有任何内容可以改变行为。

可以,当然,放入适配器上的error-channel,随后通过变压器(expression="payload.failedMessage"),随后通过用适当的交换/路由密钥配置出站适配器的队列的后面,以重新排队的消息。

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

如果错误流本身引发异常,原始消息将在头部重新排序,如前所述;如果它正常退出,该消息将被查询。