如何使用Spring集成轮询AMQP队列
我有一个用例,在使用来自AMQP(我们使用兔子)队列的消息之前,我需要等待2个小时 编辑:为了澄清我的用例。。。我需要每封邮件在阅读前等待2小时。例如,消息1在上午10点到达,消息2在10:15到达。我需要信息1在12点阅读,信息2在12点15分阅读 我们正在使用SpringIntegration3.x如何使用Spring集成轮询AMQP队列,spring,rabbitmq,spring-integration,spring-amqp,Spring,Rabbitmq,Spring Integration,Spring Amqp,我有一个用例,在使用来自AMQP(我们使用兔子)队列的消息之前,我需要等待2个小时 编辑:为了澄清我的用例。。。我需要每封邮件在阅读前等待2小时。例如,消息1在上午10点到达,消息2在10:15到达。我需要信息1在12点阅读,信息2在12点15分阅读 我们正在使用SpringIntegration3.x int-amqp:inbound channel adapter是消息驱动的,没有轮询选项 我想到了几件事: 将自动启动设置为false,并使用quartz作业手动启动入站通道适配器 创建我自
int-amqp:inbound channel adapter
是消息驱动的,没有轮询选项
我想到了几件事:
- 将
设置为false,并使用quartz作业手动启动入站通道适配器自动启动
- 创建我自己的基于轮询的自定义
(不确定这有多容易)SimpleMessageListenerContainer
- 使用以下方法在rabbitmq中配置“延迟队列”:
- 编辑:添加第四个选项:使用
将每条消息延迟2小时:delayer
有什么建议吗 我们当前没有轮询入站适配器#1很容易。对于#2,最简单的方法是使用
rabbitmplate
并从POJO中的入站通道适配器调用receive()
我会选择#1;您不需要quartz,您可以使用一个简单的Spring调度任务和一条控制总线来启动适配器。另一个技巧即将使用PollableAmqpChannel
:
<int-amqp:channel id="myQueueName" message-driven="false"/>
并为该频道的订户提供
没有理由将消息发送到该通道(因为您将轮询兔子队列中的消息),而且,它看起来像是anti-pattern
,但它是一个如何避免通过SpEL直接使用RabbitTemplate
的解决方法的挂钩
更新
可以帮助您,但这取决于您的需求。如果不希望轮询来自RabbitMQ的消息,则应使用上述解决方法。但是,如果您只是不想处理消息直到一段时间过去,您可以将其“延迟”一段时间
不要忘记添加持久的消息存储
,以避免在此期间丢失消息和意外的应用程序故障。仅供参考,我是如何解决此问题的。(使用溶液#3)
谢谢。这是一个很好的解决办法。现在有一个问题…我不确定一个可轮询的频道是否适合我,因为如果我每2小时只轮询一条消息,队列可能会真正备份。更新了我的问题以澄清我的用例。添加了有关信息的MatterStanks的评论。经过周末的反思,我不确定这两种解决方案是否能解决我的问题。我没有很好地说明我的用例。我需要让每条消息等待2小时。我认为我的问题中的选项3或新添加的选项4可能是最好的解决方案。对于该用例(每条消息延迟2小时),选项3是最好的选择;我不会介绍一个拖延者。
<rabbit:queue name="delayQueue" durable="true">
<rabbit:queue-arguments>
<entry key="x-message-ttl">
<value type="java.lang.Long">7200000</
</entry>
<entry key="x-dead-letter-exchange" value="finalDestinationTopic"/>
<entry key="x-dead-letter-routing-key" value="finalDestinationQueue"/>
</rabbit:queue-arguments>
</rabbit:queue>
<rabbit:topic-exchange name="finalDestinationTopic">
<rabbit:bindings>
<rabbit:binding queue="finalDestinationQueue" pattern="finalDestinationQueue"/>
</rabbit:bindings>
</rabbit:topic-exchange>