0

コマンドラインから実行できるSpringBatchアプリケーションが1つあります。バッチジョブのフローは、開始時にキューからメッセージを読み取り、変換してからdbに書き込みます。今これのために私は春のバッチからJmsItemReaderを使用していて、read()メソッドの中に私のロジックがあります。ここで、このプロセスの開始時にキューにメッセージが存在しない可能性があるという質問があります。このシナリオでは、バッチ全体の処理を停止します。

これはSpringBatchでどのように達成できますか?基本的に、JmsItemReaderを使用すると、jmsブローカーに継続的にpingを実行し、メッセージを読み取ってから一定期間スリープします。ここで、処理するメッセージがない場合、なぜバッチプロセスを実行し続け、CPUを消費させる必要があるのでしょうか。翌日も予定通りに走らせたいです。

ありがとう

4

1 に答える 1

1

この動作は、spring-jms によって提供される jmstemplate のデフォルト構成に由来します。

timeOut のデフォルト値は無期限です

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 の値を使用すると、呼び出しはすぐに行われます

于 2011-07-28T21:57:42.857 に答える