![](/img/trans.png)
[英]How to make Spring Integration AMQP queue transactions decoupled?
[英]How to poll an AMQP queue using Spring Integration
我有一個用例,我需要等待2個小時才能使用AMQP(我們使用Rabbit)隊列中的消息。
編輯:為了澄清我的用例...我需要每條單獨的消息要等待2個小時才能被讀取。 例如,消息1在10am到達,消息2在10:15到達。 我需要以12p讀取消息1和以12:15p讀取消息2。
我們正在使用Spring Integration3.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#延遲器 有什么建議么?
我們目前沒有輪詢入站適配器。 #1很容易。 對於#2,最簡單的方法是使用RabbitTemplate
並從POJO中的inbound-channel-adapter
調用receive()
。
我會選擇#1; 您不需要石英,可以使用簡單的Spring計划任務和控制總線來啟動適配器。
另一個技巧是使用PollableAmqpChannel
:
<int-amqp:channel id="myQueueName" message-driven="false"/>
並為該頻道的訂戶提供<poller>
。
沒有理由將消息發送到該通道(因為你會從輪詢隊列兔消息)和正確的,它看起來像anti-pattern
,但它是一個鈎子如何避免與直接的任何變通辦法RabbitTemplate
通過規划環境地政司使用。
更新
<delayer>
可以幫助您,但這取決於您的要求。 如果您不想輪詢RabbitMQ的消息,則應使用上面的解決方法。 但是,如果您只是不想在一段時間后才處理消息,則可以在該時間內“延遲”消息。
不要忘記添加持久性message-store
以避免在此期間丟失消息以及意外的應用程序故障。
僅供參考,我如何解決此問題。 (使用的解決方案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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.