骆驼工作单元

Tel*_*pdx 7 apache-camel

我试图理解骆驼中的工作单元概念。我有一个简单的问题希望这里有人可以提供帮助。

例如,如果路由交换涉及多个路由

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

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

from("direct:aws-post").to("htt4:myservice");//route3
Run Code Online (Sandbox Code Playgroud)

工作单元是否在每条路由结束时调用?还是只在路线 3 的末端?在我的示例中,一旦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
Run Code Online (Sandbox Code Playgroud)

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

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

str*_*y05 2

一个工作单元基本上就是一个事务。

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

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

我希望来自 SQS 的消息在第一个路由完成后被消耗。为了进行测试,您可以添加睡眠以允许您检查队列。

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

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