作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想了解 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/
我是一名优秀的程序员,十分优秀!