2017-05-16 13 views
0

私はCamel 2.14を使用していると言って始めます。アップグレードは現時点ではまだカードにはありません。だから私は2.17に入ったdoWhileオプションを逃してしまった。条件付きでキャメルループを終了する

私は、ルーティングがサービスインスタンスに準備ができたら配信を繰り返し試みる必要があるシナリオを持っています。これが成功すると、ループを終了する必要があります。これまでのところ、私は指定された回数だけ見ることができました。しかし、このループは成功した後も継続します。

私が検索したところ、私には多くのオプションがないようです。それとも私は私の選択肢を認識するためにまだキャメルの領域ではまだ新しいです。

+0

遅延メカニズムを追加するループのポイントはありますか? –

+0

サービスが処理できる状態になるまで待機する必要はありません。これは、テストを繰り返し実行して準備完了状態を判断する再試行メカニズムです。 – Richard

+0

@Clausと同様に、最善の方法は、まず、Beanが準備が整っているかどうかを確認し、キューからメッセージを消費することです。しかし、これらの状態を維持することは一般的にはややこしいです。あなたのbeanが決して準備ができていない場合はどうなりますか?永遠に待つつもりですか? –

答えて

0

キャメルループではなく、isReadyメソッドとdoWorkメソッドを組み合わせたJava Beanで記述できます。また、非常に長い時間ループする必要がある場合、ループについての心は良い考えではありません。準備ができていない場合は、AMQキューからは消費せず、メッセージをストアに残しておく方が良いです。

代わりに、準備完了ステータスに応じて中断/再開するルートを制御しているルートポリシーを使用できます。

これで、ルートポリシーから定期的にisReadyを確認し、それに応じてルートを一時停止/再開することができます。

http://camel.apache.org/routepolicy.html

0

私は似たような状況に直面し、自己再帰的なルートでそれに対処しました。私は、このアプローチのためにいくつかの欠点があるかどうかはわかりません。

<route> 
    <from uri="activemq:queue:myQueue" /> 
    <to uri="direct:loopingRoute"/> 
</route> 

<route> 
    <from uri="direct:loopingRoute"/> 
    <choice> 
    <when> 
     <method ref="myService" method="isReady"/> 
     <bean ref="myService" method="doWork"/> 
    </when> 
    <otherwise> 
     <to uri="direct:loopingRoute"/> 
    </otherwise> 
    </choice> 
</route> 


これは私が使用しapporachました。その質問に答えながら、1つのポイントが私の心に入った。再帰が制限を超えた場合、 stack overflowが発生しますか?

関連する問題