不能将 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
我没能用 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