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");