我是Apache Camel的新手。我们需要一起处理多个动态路径生命周期。
说,有一条路由A(静态),在接收消息时动态生成另一条路由B(B的端点在消息本身中定义,事先不知道)。为不同的消息创建了不同的路由。
我们的问题是,有一个类X,我们想要暂停A并恢复B和另一个类Y正好相反。这种切换不起作用。在X中,在A完全挂起之前,JVM尝试在B上执行resume操作,看起来线程被阻塞了。
我只是猜测它是同步问题。如何解决这类问题?
RouteManager.deactivateRoute(ROUTE_A_ID); //it creates a thread to suspend route as mentioned in Camel's documentation
RouteManager.activateRoute(ROUTE_B_ID); //it adds (when B is new) or resumes
我的日志没有例外,只发生了两件事情,
答案 0 :(得分:0)
我不确定你是怎么以及何时尝试这样做“切换”的。但是,您可能更喜欢这种EIP机制。
它被称为ControlBus,您可以发送命令来改变路由的生命周期。它有一个“异步”选项,因此当前消息(因为它在飞行中)不会干扰路由本身的关闭。
from("seda:foobar")
.routeId("myRoute")
.setBody().constant("${camelContext.stopRoute('myRoute')}")
.to("controlbus:language:simple?async=true")
答案 1 :(得分:0)
然而,似乎已经解决了。谢谢Petter的帮助。我正在使用ControlBus进行切换。但在使用它时,路线没有被
恢复producerTemplate.sendBody("controlbus:route?routeId=" + routeId + "&action=resume", null);
发现我们需要在恢复时添加以下代码段(不知道这是否是正确的方法)
producerTemplate.sendBody("controlbus:route?routeId=" + routeId + "&action=resume", null);
camelContext().getRoute(routeId).getConsumer().start();
否则它有两个问题,