2017-04-24 40 views
0

我們正在使用Apache Camel集成平臺,並通過restlets更新一些數據。我們想知道此更新的狀態,因爲它需要幾個小時才能完成。我們遇到的問題是,在程序結束之前,我們沒有收到程序的迴應。由於載體類型是restlet類型,所以我們必須等到作業完成,因爲瀏覽器正在等待它完成。我們已經研究了異步方式來做到這一點,但它似乎並不支持restlet數據載體。Restlet在Apache Camel中沒有鎖定瀏覽器直到完成

如果我們沒有得到任何解決方案,我們已經考慮使用線程池來運行這個工作,但是我們想知道它是否是其他方法來執行作業異步,因爲我們可能會稍後更廣泛地使用駱駝restlet並讓作業去async最好不要每次都執行線程。

示例代碼:

from("restlet:" +BASE_URL + "test1?restletMethods=get"). 
    routeId("Test 1"). 
    log(LoggingLevel.INFO, log.getName(), "Test 1 Started"). 
    delay(10000). 
    log(LoggingLevel.INFO, log.getName(), "Test 1 Complete"). 
    to("mock:update"); 

如從瀏覽器上面的代碼等待10秒它響應之前。我們希望瀏覽器立即可用,並在此期間獲取數據。

+0

我不知道我理解。您的代碼會在路線中添加延遲,但您還希望路線立即可用? –

+0

這是一個正在完成的工作的模擬,然後當工作正在運行時,我想在運行時獲得該工作的狀態。因爲它現在在一個更大的項目中,我們無法獲得數據,直到工作完成。我們已經注意到駱駝將restlet調用放在隊列中,並按順序執行 – Tor

+0

當然,最好創建一個後端服務的模擬,然後添加一個延遲?你可以簡單地創建一個seda隊列到一些路由,它所做的就是返回你想要的任何消息。 Seda工作異步,並應在GET後將控制權返回給瀏覽器。 –

回答

0

得到它使用SEDA與選項waitForTaskToComplete =從不在「to」方法。

from("restlet:"+BASE_URL+"seda?restletMethods=get"). 
routeId("SEDA async sender"). 
log(LoggingLevel.INFO, log.getName(), "SEDA test started"). 
log(LoggingLevel.INFO, log.getName(), "Transfer to SEDA..."). 
to("seda:test1?waitForTaskToComplete=Never"); 

from("seda:test1"). 
threads(4). 
routeId("SEDA async receiver"). 
log(LoggingLevel.INFO, log.getName(), "SEDA active"). 
delay(4000). 
log(LoggingLevel.INFO, log.getName(), "SEDA test complete"); 
//to("mock:update"); 
相關問題