骆驼路线相互依赖

时间:2014-05-02 13:10:44

标签: java synchronization apache-camel

我是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

我的日志没有例外,只发生了两件事情,

  1. “等待仍然有2个飞行和待定交换完成,300秒内超时。” - 此消息继续
  2. 什么都没打印,但B不工作(没有记录,没有)

2 个答案:

答案 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();

否则它有两个问题,

  1. 恢复命令无法使用ControlBus机制,但根据骆驼日志,它说ControlBus已成功恢复路由。 (但是将新文件添加到消费者端点对路线没有影响)
  2. Camel也忽略了以前的文件。比如,路由启动时有多个文件,然后它只是拾取第一个文件,然后暂停,然后(当调用简历时)保持沉默。