我有一个关于取消使用 RabbitMQ 的 Saga 状态机实例的问题。我有这个场景:
我有一个公开端点的 API,该端点(当被命中时)发布初始消息,该消息在状态机中启动事件链:
await _publishEndpoint.Publish<InitializeExport>(new { ExportId = request.ExportId, Payload = request.Payload });
其中 ExportId 是用于持久性的 CorrelationId (EntityFrameworkCore)
我在github上的某个地方读到取消Saga事件链的方法是发布CancelJob事件。话虽如此,我公开了另一个发布此消息的“取消”端点:
await _publishEndpoint.Publish<CancelJob>(new { JobId = request.ExportId, Reason = request?.Payload?.Reason });
如果我理解正确,当 CancelJob 发布时,“在引擎盖下”它会找到作业的 context 具有指定的 JobId(这需要与 CorrelationId 相同我想取消的工作的?),它取消了与该context相关的CancellationToken
在消费者方法中,为了检查事件链是否被取消,我需要有
context.CancellationToken.ThrowIfCancellationIsRequested()
这会抛出一个异常,我应该进一步传播并将 Saga 过渡到 final 状态?
好吧,我已经在上面尝试过了,当 CancelJob 发布时,与我要取消的 context 相关的 CancellationToken 保持不变,换句话说
context.CancellationToken.IsCancellationRequested == false
工作没有取消。
我这样做是对的,还是我遗漏了什么?
CancelJob
用于取消作业消费者(如果尚未完成)。
这与传奇无关。