2016-08-25 6 views
1

を完了されていない場合、私はこのような状況を持っているルートをトリガしません:Apacheのキャメル:以前のルートの実行が

  • Apacheのキャメルルートが
  • ルートは、大規模な長いタスク
  • を実行し、それがタイマーによってトリガーされます直前の走行がまだ進行中のときにタイマーが再び経路をトリガーすることが可能です。

大規模な作業の進行中に私のルートが再起動されないようにしたいと思います。つまり、タイマーはイベントを発行するかもしれませんが、何らかの形でトリガールートにつながるべきではありません。 大量のタスクが終了したら、タイマーが再びルートを開始できるようにする必要があります。

この動作を達成するにはどうすればよいでしょうか?

+0

あなたは時にタイマーが起動ルートがまだ実行されている場合に発生したいですか?タイマーの発射を無視して、次のタイマーが発進したときにルートが実行されるようにするか、またはルートが直前の呼び出しが終了して直後に実行されるのを待つべきですか? – JimNicholson

+0

@JimNicholson私は無視したいと思います –

答えて

1

状態を設定するメソッドと状態をテストするメソッドを使用して、ルートの実行/終了状態を保持するBeanを作成します。

<route> 
    <from uri="timer:..."> 
    <filter> 
    <method ref="routeStateBean" method="isStopped"> 
    <to uri="bean:routeStateBean?method=routeStarted"/> 
    .... 
    <to uri="bean:routeStateBean?method=routeStopped"/> 
    </filter> 
</route> 
+0

上記のxmlのJavaコードを提供してください。 – rishi

0

まあ、私の最初の反射がfixedRateオプションなしtimerperiodオプションを使用することです(つまりはfalseにfixedRateオプションを設定):その後、私はこのような何かだろうだから、

を、

from("timer:myTask?[other_options]&fixedRate=false") 
    .to("direct:lengthyProcessingRoute") 

は、タスクが完了するのを待ってから、再度タイマーをトリガーする必要があります。例えば

、(fixedRateはデフォルトでfalseです)のようなルートを宣言:

from("timer:sender?delay=5s&period=3s") 
     .log("Ping!") 
     .delay(5000) 
     .log("Ping2!"); 

はいつもの出力与える:

2016-08-26 12:36:48.130 INFO 5775 --- [ timer://sender] route1 : Ping! 
2016-08-26 12:36:53.133 INFO 5775 --- [ timer://sender] route1 : Ping2! 
2016-08-26 12:36:53.135 INFO 5775 --- [ timer://sender] route1 : Ping! 
2016-08-26 12:36:58.138 INFO 5775 --- [ timer://sender] route1 : Ping2! 

をしかし、これが唯一のあなたの長い処理ならば動作しますルートは本質的に同期しています。そうでなければ、JimNicholsonが提案しているものに似た何かをしなければならないでしょうin his answer

0

これは私のために働いたDSLのバージョンである:

private static final AtomicBoolean readyToProcess = new AtomicBoolean(true); 

public static boolean readyToProcess() { 
    boolean readyToProcess = AlarmRouteBuilder.readyToProcess.get(); 
    if (readyToProcess) { 
     AlarmRouteBuilder.readyToProcess.set(false); 
    } 
    return readyToProcess; 
} 

@Override 
public void configure() throws Exception { 

    from("timer://alarm-poll?period=5s").routeId("alarm-poll") 
      .log(LoggingLevel.INFO, "Start Timer") 
      .filter(method(AlarmRouteBuilder.class, "readyToProcess")) 
      .to("direct:alarm-dostuff") 
      .end() 
      .log(LoggingLevel.INFO, "End Timer") 
    ; 

    from("direct:alarm-dostuff").routeId("alarm-dostuff") 
//   .process(exchange -> readyToProcess.set(false)) 
      .process(exchange -> doStuff()) 
      .process(exchange -> readyToProcess.set(true)) 
    ; 
関連する問題