2016-06-22 10 views
0

メッセージの処理時間を指定することはできますか?超過すると、TIMEOUT例外がスローされますか?私はトランザクションのタイムアウトを設定しようとしましたが、うまくいきませんでした。時間が過ぎても、例外はスローされませんでした。 DefaultTransactionDefinition.getTimeout()メソッドも呼び出されませんでした(デバッガにブレークポイントがある)。 DefaultTransactionDefinition.setTimeout(int)が適切な値で呼び出されました。ここでメッセージ駆動型チャネルアダプタの期限処理

は私の設定です:

<int-jms:message-driven-channel-adapter id="x" 
             channel="incoming" 
             container="my" 
             error-channel="errors"/> 

コンテナ "私" DefaultMessageListenerContainerを拡張し、私が持っている場所です:

@Override 
@Autowired 
@Value("5") 
public void setTransactionTimeout(final int transactionTimeoutInSec) 
{ 
    super.setTransactionTimeout(transactionTimeoutInSec); 
} 

は、いくつかの他の方法はありますか?ありがとうございました!

+0

おそらく、あなたは外部の 'transaction-manager'を設定していないのでしょうか? –

答えて

0

Spring統合ではなく、少なくとも未処理のJavaで同様のことができるのだろうかと思います。私はメソッド呼び出しの期間を制限する可能性のある方法がわからないことを意味します。もちろん、非同期呼び出しといくつかのスレッドバリアを介して、何らかの理由でそれを行い、必要な例外を待って割り込みすることができます。少なくともtimeoutはでどのように動作するのですか。しかし、その1つはリクエストリプライです。あなたの場合、それは一方向の流れです。

私は示唆したように、非同期ハンドオフのAOPアドバイスを考えてもらえますが、各メッセージに対してCountDownLatchは待機し、待ち時間を希望するように制限しますtimeout。そこに他の側から

実際にそこにあなたを助けることが<barrier>のようなアウトオブボックスのコンポーネント、:

  1. あなたはターゲット・サービス
  2. にメッセージを送信するために最初 ExecutorChannel受信者と <recipient-list-router>が必要
  3. 2番目の受信者はtimeoutのメインスレッドまたは良好な結果をブロックするために<barrier>の場合はDirectChannelである必要があります。
  4. 実際のサービスフローのどこかで、メインスレッドを正しく解放する方法をtriggerBarrierHandlerにする必要があります。
  5. require-replytrueに設定することを忘れないでください。その場合、ReplyRequiredExceptionがスローされます。何とかキャッチする必要があります(例:error-channelさんのハンドラーを手に入れて、希望するものに置き換えます)
  6. correlation-strategyを指定するのを忘れないでください。

しかし、システムのオーバーヘッドではないことを確認してください。処理のタイムアウトが本当に心配する必要があるかどうかを理解しようとしましょう。

関連する問題