gpt4 book ai didi

apache-camel - Camel 工作单元

转载 作者:行者123 更新时间:2023-12-05 03:05:04 26 4
gpt4 key购买 nike

我想了解 Camel 中的工作单元概念。我有一个简单的问题,希望这里有人可以提供帮助。

例如,如果路由 Exchange 涉及多个路由

from("aws-sqs:Q1").to("direct:processMe");//route1

from("direct:processMe").to("direct:aws-post");//route2

from("direct:aws-post").to("htt4:myservice");//route3

是否在每条路线的末尾调用了工作单元?或者仅在 route3 的末尾?在我的示例中,一旦 route1 完成,SQS 消息是否会从 SQS 中删除?还是会等到我的消息到达“myservice”?

谢谢。

跟进:

我稍微修改了路线:

from("aws-sqs:Q1").to("direct:processMe");//route1

from("direct:processMe").process(
new Processor(){
public void process(Exchange exchange) throws Exception {
throw new RuntimeException("fail on purpose");
}
}
).to("direct:aws-post");//route2

from("direct:aws-post").to("http4:myservice");//route3

思路是这样的:如果在每个路由结束时调用工作单元,那么一旦从 SQS 队列中读取消息,SQS 组件将确认它已读取。另一方面,如果仅在 Exchange 完成所有路由的路由后才调用工作单元,则路由 2 中的异常将导致消息未被确认,并且在可见期到期后将可用于重新投递。

测试表明,尽管通过第一条路线阅读了该消息,但该消息仍保留在 Q 上。它一次又一次地被拾起(直到它以死信 q 结束)。因此,我坚信单位边界是由所路由的 Exchange 末端定义的。

最佳答案

A unit of work基本上是一种交易。

默认情况下,路由( Camel Exchange)的消息在单个 UnitOfWork 上下文中运行。

在您的示例中,设置了 3 个 UnitOfWork,从每个 from 开始,在每个路线的最后一个 to 结束。

我希望来自 SQS 的消息在第一条路线完成后被消费。要进行测试,您可以添加 sleep 以允许您检查队列。

from("direct:processMe").process(new Processor() 
{ void process() { try { Thread.sleep(60000L) } catch (Exception e) { } }
}).to("direct:aws-post")

如果您希望消息在 myservice 收到消息之前一直保留在队列中,那么您需要将处理放在一个路由中。

关于apache-camel - Camel 工作单元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51371202/

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