如何使用Spring Integration轮询AMQP队列

时间:2014-06-07 00:01:58

标签: spring rabbitmq spring-integration spring-amqp

我有一个用例,我需要在消耗来自AMQP(我们使用Rabbit)队列的消息之前等待2个小时。

编辑:澄清我的用例...我需要每个消息等待2个小时才能阅读。例如。消息1在上午10点到达,消息2在10:15到达。我需要在12p读取消息1,在12:15p读取消息2。

我们正在使用Spring Integration 3.x.

int-amqp:inbound-channel-adapter是消息驱动的,并且没有我可以找到的轮询选项。

我想到的一些事情:

有什么建议吗?

3 个答案:

答案 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>