使用apache camel执行路由关闭逻辑

时间:2018-05-04 13:51:10

标签: java apache-camel

我最近开始玩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是如何执行关机的,但有意义的是它不允许发送新消息,并且如果关闭路由在发送时甚至可用。
  3. 有一件事需要注意,我在这里没有处理,是确保在处理路由完成处理队列中的所有消息后执行关闭路由。我不完全确定在没有更多的机上信息之后是否调用了onStop()方法,如果没有,那么如何强制执行它?

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

    谢谢你们!

1 个答案:

答案 0 :(得分:0)

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

然而,“停止”逻辑不明确,因为当处理路由停止时,您想要向 shutdownroute 发送消息,但是如果停止发生是因为您正在关闭驼峰上下文, shutdownRoute 可能已经停止。