我最近开始玩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 回答
要以编程方式关闭路线,您还可以使用Control Bus EIP .
但是"stop"逻辑并不清楚,因为您希望在处理路由停止时向shutdownroute发送消息,但如果由于您正在关闭camel上下文而发生停止,则shutdownRoute可能已经停止 .