2012-02-02 52 views
3

我需要在指定的時間間隔內將隊列1中的消息轉發到隊列2,但不是僅在消息到達隊列1後。以下是我的配置。在Spring JMS集成中配置基於時間間隔的cron

<int-jms:inbound-channel-adapter id="inboundChannelAdapterId" connection-factory="connFactory" destination="jmsQueue1" channel="queueChannel" > 
    <int:poller send-timeout="2000" > 
     <!-- 
     <int:interval-trigger initial-delay="60000" interval="60000" 
     fixed-rate="true"/> 
     --> 
     <int:cron-trigger expression="0 0/1 * * * ?" /> 
    </int:poller> 
</int-jms:inbound-channel-adapter> 

<int-jms:outbound-channel-adapter channel="queueChannel" connection-factory="connFactory" destination="jmsQueue2" > 
</int-jms:outbound-channel-adapter> 

<int:channel id="queueChannel" /> 

上面xml配置立即將消息轉發從隊列1到隊列2,而無視< INT:輪詢>配置。我已經嘗試了基於間隔的和基於cron的解決方案,他們似乎工作相似(立即從Queue1到Queue2傳遞消息)。這裏的「輪詢器」配置有什麼問題嗎?任何幫助都感激不盡。

回答

2

您需要適配器上的接收超時。否則,它會阻止receive()並立即獲取消息。

編輯:請參閱下面的評論 - 線程輪詢隊列不再默認,自2.0.4以來的塊。

您可能還想考慮爲您的輪詢器使用2.0+語法;您當前的語法是2.0棄用和2.1不準......

<jms:inbound-channel-adapter id="in" channel="jmsinToStdoutChannel" destination="requestQueue"> 
    <poller fixed-delay="30000"/> 
</jms:inbound-channel-adapter> 

只是爲了澄清...如果接收超時設置在適配器上,輪詢線程將阻塞,長期或直到消息到達。這可能使其看起來像輪詢者不遵守其時間表。默認值(自2.0.4開始)是不會阻止這意味着只有在輪詢時間表上纔會收到消息。

+0

感謝您的回覆。我嘗試了您的建議,但沒有解決問題。當我通過文檔再次@ [鏈接](http://static.springsource.org/spring-integration/reference/htmlsingle/),它告訴我一些東西,這個功能不支持基於隊列的適配器作爲他們的接收是不是等待? **另一方面,當使用Spring Integration自己的基於隊列的通道時,超時值確實有機會參與。以下示例演示howa Polling Consumer幾乎會立即收到消息。** 您曾嘗試過嗎?再次感謝! – CoderTR 2012-03-10 04:14:44

+0

您使用的是什麼版本的Spring集成? 行爲在2.0.4中更改爲默認情況下不執行阻止呼叫。 https://github.com/garyrussell/spring-integration/commit/b59bdc0d70087b015589a70ed3cb32ef44cf6dd6 – 2012-03-12 19:38:36

+0

當前的2.0.x版本是2.0.5;但2.1.0也可用。 – 2012-03-12 19:42:36