我最近开始玩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(我不打算与多个上下文进行交互,但我还是试了一下),两者都不例外,但关机路线永远不会被击中。我有些问题
有一件事需要注意,我在这里没有处理,是确保在处理路由完成处理队列中的所有消息后执行关闭路由。我不完全确定在没有更多的机上信息之后是否调用了onStop()方法,如果没有,那么如何强制执行它?
我认为另一种方法是在每个路由的开头使用when / choice并发送某种关闭通知程序或消息,但这似乎更笨拙。
谢谢你们!
答案 0 :(得分:0)
要以编程方式关闭路线,您还可以使用Control Bus EIP。
然而,“停止”逻辑不明确,因为当处理路由停止时,您想要向 shutdownroute 发送消息,但是如果停止发生是因为您正在关闭驼峰上下文, shutdownRoute 可能已经停止。