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)。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.