首页 文章

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

提问于
浏览
1

我最近开始玩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(我不打算与多个上下文进行交互,但我还是给了它一个镜头),两者都没有异常,但是关闭路由永远不会被命中 . 我有些问题

  • 我可能使用 生产环境 者模板错了?它没有创造一个交换 .

  • 一旦启动Shutdown挂钩,我甚至可以使用ProducerTemplate吗?我允许发送新消息,并且如果在发送时甚至可以使用关闭路由 .

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

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

多谢你们!

1 回答

  • 0

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

    但是"stop"逻辑并不清楚,因为您希望在处理路由停止时向shutdownroute发送消息,但如果由于您正在关闭camel上下文而发生停止,则shutdownRoute可能已经停止 .

相关问题