2011-07-24 154 views
0

我有一個可以從命令行運行的spring批處理應用程序。批處理作業的流程是當它啓動時,它從隊列中讀取消息,然後轉換並寫入數據庫。現在,爲此,我使用JmsItemReader從spring批處理和裏面的read()方法我有我的邏輯。現在問題是,當這個過程開始時,隊列中可能沒有消息存在,在這種情況下,我想停止處理整個批處理。Spring批處理2.1和JmsReader

春季批次如何實現?基本上當你使用JmsItemReader會發生什麼,它會持續ping jms broker並讀取消息,然後休眠一段時間。現在,如果沒有消息要處理,那麼爲什麼我們應該讓批處理進程繼續運行並讓它消耗CPU。我希望它能按照計劃在第二天再次運行。

由於

回答

1

此問題來自其通過超時彈簧JMS

默認值設置用於JmsTemplate的默認配置爲不定

private long receiveTimeout = RECEIVE_TIMEOUT_INDEFINITE_WAIT; 

該值時,messageconsumer.receive()將已使用

接收到下一條消息爲這個消息消費者。 這個 無限期地呼叫塊,直到消息產生或者直到這個消息消費者關閉爲止 。

,所以你需要爲JmsTemplate的

<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> 
    (...) 
    <property name="receiveTimeout" value="someLongValueForMilliseconds" /> 
    (...) 
</bean> 

然後receive(long timeOut)將用於設置超時值

此調用塊直到消息到達時,超時到期,或此 消息消費者已關閉。零超時永不過期,並且無限期地呼叫阻止。

如果使用-1調用的值會立即發生

+0

優秀!很好的解釋 – javauser2011