如何在 MassTransit ESB 中取消与 CancelToken 的请求/响应通信

本文关键字:CancelToken 请求 通信 响应 取消 MassTransit ESB | 更新日期: 2023-09-27 17:57:09

我有一个简单的公共交通请求/响应概念证明。它由两个应用程序组成:一个用于消息发送,另一个用于消息消费。消息发送应用程序如下所示:

var basicClient=_busControl.CreateRequestClient<IRequest,IResponse>(queueUri, timeout);
return await basicClient.Request(new Request(json), token);

Request方法将CancellationToken作为第二个可选参数。

消息使用者具有以下代码:

public async Task Consume(ConsumeContext<IRequest> context)
{
      var outputJson = await _longRunningJob.Execute(context.Message.Input, context.CancellationToken);
      context.Respond(new Response(outputJson));
}

正如我们所看到的,ConsumeContext也有一个CancellationToken字段。

所以问题是:我如何使用这些代币?

在我的消息发送应用程序中,我想取消等待响应,在消息消费者中,我想取消等待_longrunningJob完成。

  1. 当我尝试将令牌传递给 Request 方法,然后在我的CancellationTokenSource上调用 Cancel() 时,我希望该方法会抛出OperationCancelledException,但我只是得到响应!
  2. 我也尝试将已经取消的令牌传递给此方法,但没有任何反应。
  3. 然后我查看了Masstransit的源代码并找到了该令牌。ThrowIfCancelIsRequest() 在任何地方都没有被调用!

所以,请告诉我,我在这里做错了什么,还有另一种处理取消令牌的方法,或者它只是一个公共交通的错误?

如何在 MassTransit ESB 中取消与 CancelToken 的请求/响应通信

传递到请求中的CancellationToken是取消请求本身,它不会传递给使用者。

我们设法使用以下方法取消消费者:

  1. 将到期日期标头添加到请求(UtcNow + 超时)
  2. 在消费者中,将 ExpiryDate 标头与 UtcNow 进行比较,如果它较旧,则退出该方法