【发布时间】: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(我不打算与多个上下文交互,但我还是试了一下),两者都不例外,但关闭路线永远不会打。我有一些问题
- 我可能使用错了生产者模板?它看起来不像是在创建交换。
- 启动 Shutdown 挂钩后,我什至可以使用 ProducerTemplate 吗?我不确定 Camel 是如何执行关闭的,但它不允许发送新消息以及关闭路由在发送时是否可用是有道理的。
需要注意的一点是,我在这里不处理,确保在处理路由完成处理其队列中的所有消息之后执行关闭路由。我不完全确定在没有更多飞行消息后是否调用 onStop() 方法,如果没有,如何执行?
我认为另一种方法是在每条路由的开头使用 when/choice 并发送某种关闭通知或消息,但这似乎有点笨拙。
谢谢大家!
【问题讨论】:
标签: java apache-camel