1

次の時間コンポーネントがあるとしましょう:

from("timer://foo?period=1000").setBody(constant("select * from customer")).to("jdbc:testdb").to("beanRef:processResult");

ここでタイマーコンポーネントはどのように機能しますか? 1秒ごとにデータベースから読み取るか、Beanが処理を完了するのを待ちますか?

Bean がまだ以前の結果を処理しており、タイマーがデータベースをポーリングし続ける場合、ボトルネックが発生します。それを回避する方法はありますか?

4

1 に答える 1

2

わかりました、更新: ソース コードを見ると、タイマー コンポーネントは Java TimerTask 実装に依存しています。そして、あなたの質問はすでにここで回答されています: Is Java's Timer task Guaranteed to not run同時に?

簡単な答え: 1 つのスレッドがトリガーとそれに接続されたルートを実行するため、同時実行はありません。

そうは言っても、実行を少し制御したい場合があります。タイマー タスク (したがって Camel タイマー) では、タイマーの期間と最大タスク実行時間の間に余裕を持たせることをお勧めします。

間に SEDA コンポーネント (concurrentConsumers=[num threads] を指定) を使用して、ワーク キューで実行をきめ細かく制御できます。実際のルートが処理を続行できる間、タイマーはそのタスクをすぐに終了します。

from("timer://foo?period=1000")
    .to("seda:startRoute");

from("seda:startRoute")
    .setBody(constant("select * from customer"))
    .to("jdbc:testdb").to("beanRef:processResult");

各イベントはそれ以下ではなく積み重なるため、時間の経過とともに、期間 > 平均ルート実行時間になるようにルートを調整することをお勧めします。

シングルトン Bean または静的クラスのいずれかに共有ブール変数を追加できます。

public static synchronized boolean  isRunning(){
    return running;
}

public static synchronized void setRunning(boolean isRunning){
    running = isRunning;
}

変数は、ルートが実行されているかどうかを示し、変数が true である間に発生するタイマー イベントをフィルター処理する必要があります。これを処理するには、いくつかのプロセッサ/Bean 呼び出しを接続するだけです。

于 2012-06-05T04:56:18.833 に答える