2016-08-25 46 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選項(即設置fixedRate選項設置爲false):

所以,聲明:

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)) 
    ;