Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Spring集成轮询AMQP队列_Spring_Rabbitmq_Spring Integration_Spring Amqp - Fatal编程技术网

如何使用Spring集成轮询AMQP队列

如何使用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作业手动启动入站通道适配器 创建我自

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

编辑:为了澄清我的用例。。。我需要每封邮件在阅读前等待2小时。例如,消息1在上午10点到达,消息2在10:15到达。我需要信息1在12点阅读,信息2在12点15分阅读

我们正在使用SpringIntegration3.x

int-amqp:inbound channel adapter
是消息驱动的,没有轮询选项

我想到了几件事:

  • 自动启动
    设置为false,并使用quartz作业手动启动入站通道适配器
  • 创建我自己的基于轮询的自定义
    SimpleMessageListenerContainer
    (不确定这有多容易)
  • 使用以下方法在rabbitmq中配置“延迟队列”:
  • 编辑:添加第四个选项:使用
    delayer
    将每条消息延迟2小时:

有什么建议吗

我们当前没有轮询入站适配器#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>