使用阿帕奇骆驼执行路由关闭逻辑



我最近开始使用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. 一旦启动了关闭钩子,我甚至可以使用生产者模板吗?我不确定Camel如何执行关闭,但是它不允许发送新消息以及关闭路由在发送时是否可用是有道理的。

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

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

谢谢大家!

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

但是,"stop"逻辑并不明确,因为您希望在处理路由停止时向关闭路由发送消息,但如果停止是因为您正在关闭骆驼上下文而发生的,则shutdownRoute可能已经停止。

最新更新