我正在尝试理解Camel中的工作单元概念。我有一个简单的问题,希望这里有人能帮上忙。
如果在路由Excachange时涉及多个路由,例如
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的末端定义的。
发布于 2018-07-17 07:26:34
unit of work基本上就是一个事务。
默认情况下,路由( camel Exchange)的消息在单个UnitOfWork上下文中运行。
在您的示例中,设置了3个UnitOfWork,从每个from开始,到每个路由的最终to结束。
我希望来自SQS的消息在第一个路由完成后被使用。为了进行测试,您可以添加一个睡眠,以允许您检查队列。
from("direct:processMe").process(new Processor()
{ void process() { try { Thread.sleep(60000L) } catch (Exception e) { } }
}).to("direct:aws-post")如果您希望消息保留在队列中,直到myservice获得消息,那么您需要将处理放在单个路由中。
发布于 2018-09-12 05:08:19
我找到了关于工作单元边界的一个很好的解释:
“OnCompletion DSL名称用于定义当一个工作单元完成时将发生的操作。
工作单元是一个包含整个交换的骆驼概念。请参阅第43.1节,“交换”。onCompletion命令具有以下功能:
在SQS处理的情况下,使用者在交换上定义onCompletion。因此,只有在交换完成路由之后才会调用它。
完整的答案可以在这里找到:Apache Camel Development Guide2.11. OnCompletion
https://stackoverflow.com/questions/51371202
复制相似问题