【问题标题】:Perform route Shutdown Logic with apache camel使用 apache camel 执行路由关闭逻辑
【发布时间】:2018-05-04 13:51:09
【问题描述】:

我最近开始使用 Apache Camel,我遇到的问题之一是在选择性路由上正确执行关闭逻辑。由于路由之间的关闭逻辑会有所不同,因此 Camel 的 RoutePolicy 最有意义。这是我为什么要这样做的一个示例。

public class ProcessingRouteBuilder extends RouteBuilder {
  private ProducerTemplate prodTemplate;

  public class ProcessingRouteBuilder(ProducerTemplate aProdTemplate) {
    prodTemplate = aProdTemplate; 
  }

  @Override
  public void configure() {
    from("direct://processing")
      .routePolicy(new RoutePolicySupport() {
        @Override
        public void onStop(Route route) {
          super.onStop(route);
          prodTemplate.sendBody("direct://shutdownRoute", "msg");
        }
      })
      .process(ex -> // Do stuff)

    from("direct://shutdownRoute")
      .log("Running shutdown A route body - ${body}");
  }
}

关机就像 (http://camel.apache.org/how-can-i-stop-a-route-from-a-route.html) 一样。 ProducerTemplate 来自主 CamelContext(请阅读,为每个上下文创建一个 ProducerTemplate 是一种很好的做法)。

运行它会给我一个 DirectConsumerNotAvailableException,我使用了 seda 和 vm(我不打算与多个上下文交互,但我还是试了一下),两者都不例外,但关闭路线永远不会打。我有一些问题

  1. 我可能使用错了生产者模板?它看起来不像是在创建交换。
  2. 启动 Shutdown 挂钩后,我什至可以使用 ProducerTemplate 吗?我不确定 Camel 是如何执行关闭的,但它不允许发送新消息以及关闭路由在发送时是否可用是有道理的。

需要注意的一点是,我在这里不处理,确保在处理路由完成处理其队列中的所有消息之后执行关闭路由。我不完全确定在没有更多飞行消息后是否调用 onStop() 方法,如果没有,如何执行?

我认为另一种方法是在每条路由的开头使用 when/choice 并发送某种关闭通知或消息,但这似乎有点笨拙。

谢谢大家!

【问题讨论】:

    标签: java apache-camel


    【解决方案1】:

    要以编程方式关闭路由,您还可以使用Control Bus EIP。

    但是“停止”逻辑不清楚,因为您希望在 processing 路由停止时向 shutdownroute 发送消息,但如果停止发生是因为您正在关闭骆驼上下文,shutdownRoute 可能已经停止。

    【讨论】:

    • 谢谢,我得看看那个 EIP。我目前正在考虑制作自定义 ShutdownStrategy,以便在处理路由完成之前不会暂停/停止 Shutdown 路由。将根据我的发现进行更新。
    猜你喜欢
    • 2016-09-29
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    相关资源
    最近更新 更多