2017-04-24 76 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");