我有
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没有一个简单的解决方案。
暂无答案!
目前还没有任何答案,快来回答吧!