9.4.5. 使用手动完成(高级)

当 Saga 无法以同步的方式执行,但需要它,例如:使用异步通信频道与外部服务通信时,无法将完成模式设置为 AUTO (默认),因为 Saga 在创建交换时没有完成。这通常是具有长执行时间(小时、天)的 Saga EIP。在这些情况下,应使用 MANUAL 完成模式。

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 小时)。当两个异步操作都完成后,Saga 已完成。要完成的调用是使用 Camel Saga Component saga:complete 端点完成的。有一个类似的端点用于手动处理 Saga(saga:compensate)。