2015-06-24 86 views
0

我想運行一次路線並在路線完成時停止上下文。目前,我在主Java類中執行通常的Thread.sleep(3000),爲路由留下了一些時間,但顯然不準確,我的路由可能需要1秒鐘或20秒,我不能提前知道。駱駝和春天:路線完成時停止上下文

的Java類:

public static void main(String[] args) throws Exception { 
    try (ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("camel-context.xml")) { 
     CamelContext camelContext = SpringCamelContext.springCamelContext(context); 
     // context.start(); // apparently not necessary 
     camelContext.startRoute("route1"); 
     try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } 
     // context.stop(); // apparently not necessary 
    } 
} 

Spring的XML:

<route id="route1" autoStartup="false"> 
    <from uri="timer://runOnce?repeatCount=1&amp;delay=3000" /> 
    ... 
</route> 

閱讀http://camel.465427.n5.nabble.com/Need-control-back-in-the-Main-routine-so-that-we-can-terminate-JVM-td4483312.html#a4484845尤其是第4後,克勞斯易卜生後,我想在使用camelContext.getRouteStatus()的使用Thread.sleep()循環,但無論我嘗試在代碼中獲取路由狀態(即使在Thread.sleep(3000)之後),狀態總是「開始」。我不知道任何其他方式來檢測路線何時完成。

使用Spring完成/全部路由完成時停止駱駝上下文的推薦方法是什麼?

回答

2

由於路線沒有complete狀態,路線將永不停止。他們可以開始,停止或暫停。如果路線處於起始狀態,路線將始終運行,除非您執行某些操作來更改該路線。

來完成你在找什麼,你可以做兩件事情:

  • 可以使用controlbus組件,並在路線的最後一步停止路線。這樣你可以檢查(例如你提到的檢查camelContext.getRouteStatus()的方式),當你應該停止上下文。

  • 您可以編寫一個小Processor,只要它收到Exchange它將停止camelContext。一旦準備就緒,您將把它添加到路線的最後一步。

  • 駱駝支持onCompletion回調,它可以等同於上面的選項。請參閱camel page

也許,第一個選項對您的用例來說是最簡單的,但是我會選擇第二個選項。這對我來說似乎更清潔。

+0

其實我已經在路線的終點的處理器,所以我會去你的第二個選項,但我仍然需要在try {了Thread.sleep(3000); }在Main類中有一個很大的數字吧?因爲正如你在我的代碼中看到的那樣,即使沒有context.stop(),上下文也會立即停止。 –

0

更優雅的方式是使用Java提供的同步機制,如CountDownLatch。主線程將等待閂鎖被Route線程打開。例如:

CountDownLatch latch = new CountDownLatch(1); 
camelContext.addRoutes(createRoute(latch)); 

和createRoute方法中的某處在路徑的末尾添加一個處理器以打開鎖存器。這對我來說非常合適。

.process(new Processor() { 
    @Override 
    public void process(Exchange exchange) throws Exception { 
     latch.countDown();         
    } 
});