9.4.2. 使用自定义标识符和选项

您可以使用 Saga 选项来注册自定义标识符。例如,贡献度服务被重构,如下所示:

  1. 生成自定义 ID 并在正文中设置它,如下所示:
from("direct:reserveCredit")
  .bean(idService, "generateCustomId")
  .to("direct:creditReservation")
  1. 在编写操作中需要委派操作,并根据需要标记当前的正文。
from("direct:creditReservation")
  .saga()
  .propagation(SagaPropagation.SUPPORTS)
  .option("CreditId", body())
  .compensation("direct:creditRefund")
    .bean(creditService, "reserveCredit")
    .log("Credit ${header.amount} reserved. Custom Id used is ${body}");
  1. 仅在 saga 被取消时从标头检索 creditId 选项。
from("direct:creditRefund")
  .transform(header("CreditId")) // retrieve the CreditId option from headers
  .bean(creditService, "refundCredit")
  .log("Credit for Custom Id ${body} refunded");

可以在 Saga 外部调用 direct:creditReservation 端点,方法是将 propagation 模式设置为 SUPPORTS。这样,可以在 Saga 路由中声明多个选项。