camel拦截器与bean逻辑一起回滚

tkqqtvp1  于 2021-07-06  发布在  Java
关注(0)|答案(0)|浏览(207)

我有

intercept()
   .process(exchange -> {
      final LocalDateTime now = LocalDateTime.now();
      Integer retryCounter = (Integer) exchange.getIn().getHeader(Exchange.REDELIVERY_COUNTER);
      if (retryCounter == null) {
          exchange.setProperty(ControlFlow.STEP_START_DATE, now);
      }
});

   from(....)
    // I assume that interceptor is invoked here 
    .bean(Processor1.class)
     // and here
    .bean(Processor2.class)
     // and here, am I right?
    .bean(Processor3.class)
   to(...)

所以基本上我在每个bean(*)之前启动计时器,在bean逻辑的某个地方停止计时器,计算结束-开始并保存到数据库中。一切都很顺利,直到我发现当前的方法不适合重试。当camel重试时,它不会将交换状态回滚到前一个bean交换状态,而是回滚到前一个bean+拦截器。
示例:假设processor2继续重试,

from(....)
    // I assume that interceptor is invoked here 
    .bean(Processor1.class)
     // actual exchange state before next retry
     // and here
     // expected exchange state before next retry
    .bean(Processor2.class)
     // and here, am I right?
    .bean(Processor3.class)
   to(...)

在第一次重试之后,step\u start\u date等于在第一个拦截器中设置的值,这非常混乱。它迫使我在每个bean和设置步骤开始日期之前创建额外的处理器,但是我有100多个bean在管道中,这是最后的解决方案

from(....)
    .process()
    .bean(Processor1.class)
    .process()
    .bean(Processor2.class)
    .process()
    .bean(Processor3.class)
   to(...)

这很不方便,我想我确实做错了,因为我不敢相信如此成熟的lib没有一个简单的解决方案。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题