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

问题描述 投票:0回答:1

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

工作没有取消。

我这样做是对的,还是我遗漏了什么?

c# .net rabbitmq masstransit
1个回答
0
投票

CancelJob
用于取消作业消费者(如果尚未完成)。

这与传奇无关。

© www.soinside.com 2019 - 2024. All rights reserved.