gpt4 book ai didi

java - 使用 apache Camel 执行路由关闭逻辑

转载 作者:太空宇宙 更新时间:2023-11-04 10:29:29 25 4
gpt4 key购买 nike

我最近开始使用 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(我不打算与多个上下文交互,但我无论如何都试了一下),两者都不异常(exception),但关闭路由永远不会被击中。我有一些问题

  1. 我可能使用了错误的生产者模板?它看起来不像是在创建交换。
  2. 启动 Shutdown hook 后我还可以使用 ProducerTemplate 吗?我不确定 Camel 如何执行关闭,但它不允许发送新消息,并且关闭路由在发送时是否可用,这是有道理的。

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

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

谢谢大家!

最佳答案

要以编程方式关闭路由,您还可以使用 Control Bus EIP .

但是,“停止”逻辑并不明确,因为当 processing 路由停止时,您希望向 shutdownroute 发送消息,但如果由于您关闭 Camel 上下文而发生停止,则 shutdownRoute 可能已经停止。

关于java - 使用 apache Camel 执行路由关闭逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50176554/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com