9.4.3. 设置超时

在 Saga EIP 中设置超时可确保 Saga 在机器发生故障时不会一直处于卡住状态。Saga EIP 实施在未明确指定它的所有 Saga EIP 上设置了默认超时。当超时过期时,Saga EIP 将决定 取消 Saga (并合约所有参与者),除非之前已进行了不同的决定。

在 Saga 参与者中可以按照如下方式设置超时:

from("direct:newOrder")
  .saga()
  .timeout(1, TimeUnit.MINUTES) // newOrder requires that the saga is completed within 1 minute
  .propagation(SagaPropagation.MANDATORY)
  .compensation("direct:cancelOrder")
  .completion("direct:completeOrder")
    // ...
    .log("Order ${body} created");

所有报名者(如服务、订单服务)都可以设置自己的超时。当由 saga 组成时,这些超时的最小值会作为超时。也可以在 Saga 级别指定超时,如下所示:

from("direct:buy")
  .saga()
  .timeout(5, TimeUnit.MINUTES) // timeout at saga level
    .to("direct:newOrder")
    .to("direct:reserveCredit");