不能将 onCompletion 路由范围与事务路由一起使用

Can't use onCompletion route scope with transacted routes

我没能用 rollback/commit post-processing 自定义交易路线。非常感谢任何有关如何编写这种交易路线的帮助。基于一些example code,我写了这样的东西:

from(direct("global")
  .log("anything before that doesn't need transaction context")
  .to(direct("transacted")
  .log("anything after that doesn't need transaction context")
;

from(direct("transacted"))

  .onCompletion().onCompleteOnly()
    .validate().simple("${body.state} == 'MOVE_SUCCESS'")
    .log("success, with commit ")
  .end()

  .onCompletion().onFailureOnly()
    .validate().simple("${body.state} == 'WAITING_MOVE'")
    .bean(DbService.class, "documentInError(${body}, ${exception})")
    .bean(FileService.class, "moveFileToError")

    .log("error, with rollback")
  .end()

  .transacted()
    .bean(DbService.class, "updateDocument")
    .bean(FileService.class, "moveFileToTarget")      
;

但不知道为什么,我仍然有这种错误:

Caused by: java.lang.IllegalArgumentException: The output must be added as top-level on the route. Try moving onCompletion[[]] to the top of route. at camel.core.model@3.15.0/org.apache.camel.model.ProcessorDefinition.addOutput(ProcessorDefinition.java:209) ~[camel-core-model-3.15.0.jar:na] at camel.core.model@3.15.0/org.apache.camel.model.ProcessorDefinition.onCompletion(ProcessorDefinition.java:3637) ~[camel-core-model-3.15.0.jar:na]

我被允许仅在任何路线“外部”声明那些 onCompletion,但这与我想要的不符。因为 onCompletion 处理同时在全局和事务路由中进行,导致其他问题。

我已经对 onException 应用程序进行了明智的配置,并对 FileService 错误(处理处理器节点的重新交付)进行了重试策略。并且希望让他们明智地配置应用程序。

谢谢,

通过在两个不同的路由构建器中分离全局路由和事务路由,我们最终实现了 onCompletion 和 onException 的路由范围。

但我们决定在 java (spring) 而不是 camel 中处理交易。 主要是camel中事务范围很难搞清楚。事务错误处理程序,一旦 redelevery 策略用尽,就会带头,并且似乎在 onException 中发生,没有明确的界限:

例如:

onException(IOException)
  // the "following" (whatever holds behind the scene) happens inside transaction
  .maximumRedeliveries(3)
  .retryAttemptedLogLevel(WARN)
  .retriesExhaustedLogLevel(ERROR)
  .onExceptionOccurred(exceptionOccurredProcessor)
                
  // then on redelivery exhaustion the transaction is rolledback
  // the following happens after rollback
  .log(...)
  .to(...)

我们不得不让数据库操作支持重试(由于一些自治事务),但这比为骆驼事务路由构建更简单。

另外,transacted route的主要目的也是jms中消息的回滚,但我们不希望这样,因为我们用DLQ处理错误

with_spring_transaction