9.4.5. 使用手动完成(高级)
当 Saga 无法以同步的方式执行所有 Saga 时,它要求使用异步通信频道与外部服务通信,然后完成模式无法设置为 AUTO (默认),因为当创建该文件时 Saga 不会在创建该文件时完成 Saga。这通常是执行时间较长的 Saga EIP (小时、天)。在这些情况下,应使用 MANUAL completion 模式。
from("direct:mysaga")
.saga()
.completionMode(SagaCompletionMode.MANUAL)
.completion("direct:finalize")
.timeout(2, TimeUnit.HOURS)
.to("seda:newOrder")
.to("seda:reserveCredit");
为 seda:newOrder 和 seda:reserveCredit 添加异步处理。这些会将异步回调发送到 seda:operationCompleted。
from("seda:operationCompleted") // an asynchronous callback
.saga()
.propagation(SagaPropagation.MANDATORY)
.bean(controlService, "actionExecuted")
.choice()
.when(body().isEqualTo("ok"))
.to("saga:complete") // complete the current saga manually (saga component)
.end()
您可以添加 direct:finalize 端点来执行最终操作。
将完成模式设置为 MANUAL 意味着当交换在路由 direct:mysaga 中处理时 Saga 不会被完成,但它会持续超过 2 小时(最长持续时间设置为 2 小时)。完成两个异步操作后,Saga 已完成。完成的调用是使用 Camel Saga 组件的 saga:complete 端点完成的。有一个类似的端点用于手动分离 Saga (saga:compensate)。