rabbitmq 在 Saga 状态机中取消的正确方法

14ifxucb  于 2023-02-22  发布在  RabbitMQ
关注(0)|答案(1)|浏览(298)

我有一个关于取消使用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

任务也不会取消。
我做得对吗,还是我错过了什么?

wdebmtf2

wdebmtf21#

CancelJob用于取消作业消费者(如果尚未完成)。
这和传奇故事无关。

相关问题