【问题标题】:Camel Route Interdependency骆驼路线相互依存
【发布时间】:2014-05-02 13:10:43
【问题描述】:

我对 Apache Camel 非常陌生。我们需要同时处理多个动态路由生命周期。

比如说,有一个路由 A(静态),它在接收到消息时会动态生成另一个路由 B(B 的端点在消息本身中定义,事先不知道)。为不同的消息创建了不同的路由。

我们的问题是,有一个 X 类,我们想从其中暂停 A 并恢复 B,而另一个类 Y 正好相反。此切换不起作用。在 X 中,在 A 完全挂起之前,JVM 尝试对 B 执行恢复操作,看起来线程被阻塞了。

我只是猜测这是一个同步问题。如何解决此类问题?

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 不工作(没有日志,什么都没有)

【问题讨论】:

  • Camel 默认支持优雅关闭camel.apache.org/graceful-shutdown.html,所以你可以在关闭路由时看到正在等待的消息。我需要了解更多关于您如何激活 routeB 的信息。
  • @WillemJiang:我们从camelContext.startRoute(B)开始路线B

标签: java synchronization apache-camel


【解决方案1】:

我不确定您如何以及何时尝试执行此“切换”。但是,您可能更喜欢使用 EIP 机制。

它叫做ControlBus,你可以发送命令来改变路由的生命周期。它有一个“异步”选项,因此当前消息(因为它在飞行中)不会干扰路由本身的关闭。

from("seda:foobar")
.routeId("myRoute")
.setBody().constant("${camelContext.stopRoute('myRoute')}")
.to("controlbus:language:simple?async=true")

【讨论】:

  • 我们的 X 类是路由 A 的处理器。ControlBus 示例将在该处理器上工作吗?你能提供小代码sn-p..
  • 如果您坚持在处理器内部进行,请使用 RequestTemplate 将上述命令发送到控制总线。
  • @Peter:感谢您的帮助。暂停 B => ProducerTemplate producerTemplate = camelContext.createProducerTemplate(); producerTemplate.sendBody("controlbus:language:simple", "${camelContext.suspendRoute(" + "B" + ", 5, " + TimeUnit.SECONDS + ")}");恢复 A => ProducerTemplate producerTemplate = camelContext.createProducerTemplate(); producerTemplate.sendBody("controlbus:route?routeId=" + "A" + "&action=resume", null);但是一旦暂停,B就不能恢复了?任何想法..
【解决方案2】:

不过,好像已经解决了。感谢彼得的帮助。我正在使用 ControlBus 进行切换。但是在使用它时,路由没有得到恢复

producerTemplate.sendBody("controlbus:route?routeId=" + routeId + "&action=resume", null);

发现我们在恢复时也需要添加下面的sn-p(不知道这样是否正确)

producerTemplate.sendBody("controlbus:route?routeId=" + routeId + "&action=resume", null);
camelContext().getRoute(routeId).getConsumer().start();

否则有两个问题,

  1. Resume 命令无法使用 ControlBus 机制工作,但根据骆驼日志,它表示 ControlBus 已成功恢复路由。 (但向消费者端点添加新文件对路由没有影响)
  2. Camel 也忽略了以前的文件。比如说,当路由启动时有多个文件,然后它只拾取第一个文件,然后挂起,然后(当调用恢复时)静默。

【讨论】:

    猜你喜欢
    • 2018-09-05
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多