我有一个关于取消使用RabbitMQ的 Saga 状态机示例的问题。
我有一个API,它公开了一个端点,该端点(当被击中时)发布初始消息,该消息触发状态机中的事件链:
await _publishEndpoint.Publish<InitializeExport>(new { ExportId = request.ExportId, Payload = request.Payload });
其中,ExportId是用于持久性的 CorrelationId(实体框架核心)
我在github上读到取消 Saga 事件链的方法是发布***CancelJob***事件,然后我公开了另一个发布以下消息的“取消”端点:
await _publishEndpoint.Publish<CancelJob>(new { JobId = request.ExportId, Reason = request?.Payload?.Reason });
如果我没理解错的话,当发布***CancelJob***时,它会“在幕后”查找具有指定***JobId***的作业的***上下文***(这需要与我要取消的作业的 CorrelationId 相同?),并取消与该***上下文***相关的***CancellationToken***
在使用者方法中,为了检查事件链是否已取消,我需要context.CancellationToken.ThrowIfCancellationIsRequested()
哪一个会抛出一个异常,我应该进一步传播并将 Saga 转换到*final*状态?
我已经在上面尝试过了,当发布*CancelJob*时,与我想要取消的上下文相关的CancellationToken保持不变,换句话说
context.CancellationToken.IsCancellationRequested == false
任务也不会取消。
我做得对吗,还是我错过了什么?
1条答案
按热度按时间wdebmtf21#
CancelJob
用于取消作业消费者(如果尚未完成)。这和传奇故事无关。