当前位置: 首页 > 知识库问答 >
问题:

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

卢锋
2023-03-14

我最近开始使用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}");
  }
}

运行这个会给我一个DirectConsumerNotAvailableException,我已经使用了seda和vm(我不打算与多个上下文交互,但我已经尝试过了),两者都没有异常,但关机路由从未被击中。我有一些问题

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

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

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

谢谢伙计们!

共有1个答案

田焕
2023-03-14

要以编程方式关闭路由,还可以使用控制总线EIP。

但是,“停止”逻辑并不清楚,因为当处理路由停止时,您希望向shutdownroute发送一条消息,但是如果停止是因为您正在关闭骆驼上下文,那么shutdownroute可能已经停止了。

 类似资料:
  • 路由执行体 Tango 支持 5 种形式的函数或结构体方法作为执行体: func() func(http.ResponseWriter, *http.Request) func(*tango.Context) func(http.Response.Writer) func(*http.Request) struct.Get() func() t := tango.Classic() t.Get("

  • 我怎么能在最后运行一些逻辑,而不是收集。 我可以像 我如何在过滤后运行最后的逻辑。 谢谢,拉维

  • 1)进入设置界面,点击“无线和网络”,如下图所示: 2)进入如下界面,点击“WLAN”,如下图所示: 3)进入如下界面,如果有“WLAN+”并且显示“已开启”,则点击“WLAN+”,如下图所示: 4)进入如下界面,关闭“WLAN+”,如下图所示:

  • 我想测试以下骆驼路线。我在网上找到的所有例子都有以文件开头的路由,在我的例子中,我有一个Springbean方法,每隔几分钟就会被调用一次,最后消息被转换并移动到jms以及审计目录。 我对这条路线的写测试毫无头绪。目前我在测试用例中所拥有的是

  • 为了定义辅助路由,我们必须首先添加一个命名的路由出口,其中要呈现辅助路由的内容。 接下来,我们必须定义到应用程序的辅助路由的链接,以导航和呈现内容。 每个辅助路由是独立的路由,可以拥有: 自己的辅助路由 自己的浏览器历史记录栈

  • 将路由链接到参数 显示特定产品详细信息的组件的路由需要该产品ID的路由参数。我们可以使用以下实现: 注意:product-details路由的路径中的 ,它将参数放在路径中。例如,要查看ID为5的产品的产品详细信息页面,必须使用以下URL:localhost:3000/product-details/5 注意,指令传递一个数组,该数组指定路径和路由参数。或者,我们可以使用JS跳转: Product