2012-01-19 10 views
6

私は、いくつかのキューやトピックを聞くために、Springのメッセージ駆動型POJOフレームワーク(特にDefaultMessageListenerContainer)を使用しています。Springがキューから受け取るレートを制御するにはどうしたらいいですか?

特に1つのキューの場合、5分ごとに1つのメッセージのオーダーで、キューを排出する速度を遅くする必要があります。メッセージの実際の処理はサブ秒の操作ですが、リスナーがメッセージの間にある程度の間アイドル状態になるようにしたいと思います。

私はちょっとしたハックを作成しましたが、明らかに準最適です。最大同時処理数を1に設定し、各メッセージの処理後にThread.sleep(..)を追加することです。私は代わりにメッセージを処理している間にハンドラが待機するようにするのではなく、受信しようとするのを待つためにDefaultMessageListenerContainerを使用する方法を見つけたいと思います。

ScheduledExecutorがあると思っていましたが、タスクが生成される場所でスロットルを行う必要があることがわかりました。 DefaultMessageListenerContainerから、後で何を達成するためにオーバーライドできる方法がありますか?

答えて

0

私は100%は分かりませんが、receiveTimeoutはあなたが望むものだと思います。

<bean id="blahContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
    .... 
    <!-- 300000 = 5 * 60 * 1000 == 5 min --> 
    <property name="receiveTimeout" value="300000"/> 
</bean> 

receiveTimeoutは、あなたがその1つの特定のメッセージを遅らせるためにApacheのキャメルを利用することであろうあなたの消費者の行動を修正するにjavadocs

+1

私が間違っていない限り、私はあなたが 'receiveTimout'を参照していると思います。このプロパティは、 'MessageConsumer'を破棄する前に指定された時間キューから受信を試みます。 – Ray

+0

ああ、そうだよ、私はreceiveTimeoutについてだった( – ruslan

+3

あなたが正しい場合は、あなたの答えを編集する必要があります。 – Gray

3

代わりにそれについての詳細を読むことができ、ミリ秒単位でタイムアウトを受け入れますキュー。

http://camel.apache.org/delayer.htmlは、Camel Delayerパターンの機能を記述する。たとえば、次のようになります。

<route> 
    <from uri="jms:YOURQUEUE"/> 
    <delay> 
     <constant>1000</constant> 
    </delay> 
    <to uri="jms:DELAYEDQUEUE"/> 
</route> 

ここで、DELAYEDQUEUEを消費すると、すべてのメッセージが1秒遅れます。

4

キューのプロバイダによっては、キューを消費するコンシューマの最大レートを設定できる場合があります。

たとえば、hornetQでは、これを接続ファクトリでconsumer-max-rateを使用して設定します。

関連する問題