我有一个用例,我需要在消耗来自AMQP(我们使用Rabbit)队列的消息之前等待2个小时。
编辑:澄清我的用例...我需要每个消息等待2个小时才能阅读。例如。消息1在上午10点到达,消息2在10:15到达。我需要在12p读取消息1,在12:15p读取消息2。
我们正在使用Spring Integration 3.x.
int-amqp:inbound-channel-adapter
是消息驱动的,并且没有我可以找到的轮询选项。
我想到的一些事情:
auto-startup
设置为false并使用石英作业手动启动入站通道适配器。SimpleMessageListenerContainer
(不确定这将是多么容易)delayer
将每封邮件延迟2小时:http://docs.spring.io/spring-integration/docs/3.0.2.RELEASE/reference/html/messaging-endpoints-chapter.html#delayer 有什么建议吗?
答案 0 :(得分:1)
我们目前没有轮询入站适配器。 #1很简单。对于#2,最简单的方法是使用RabbitTemplate
并从POJO中的receive()
调用inbound-channel-adapter
。
我会选择#1;你不需要石英,你可以使用一个简单的Spring计划任务和一个控制总线来启动适配器。
答案 1 :(得分:1)
另一个技巧是使用PollableAmqpChannel
:
<int-amqp:channel id="myQueueName" message-driven="false"/>
并为该频道的订阅者提供<poller>
。
没有理由向该频道发送消息(因为您将从Rabbit Queue轮询消息),而且,它看起来像anti-pattern
,但它是一个钩子,如何避免使用直接{{}的任何变通方法1}}通过SpEL使用。
<强>更新强>
RabbitTemplate
可以为您提供帮助,但这取决于您的要求。如果您不想从RabbitMQ轮询消息,则应使用上面的解决方法。但是,如果您只是想要处理消息,直到某个时间过去,您就可以延迟&#39;那个时候。
请勿忘记添加持久性<delayer>
,以避免在此期间丢失邮件以及意外的应用程序失败。
答案 2 :(得分:0)
仅供参考,我是如何解决这个问题的。 (使用的解决方案#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>