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

时间:2016-07-15 10:59:46

标签: c# masstransit cancellation

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

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方法,然后在Cancel()上调用CancellationTokenSource时,我希望该方法可以抛出OperationCancelledException,但我只是得到了响应<!/ LI>
  2. 我也尝试将已取消的令牌传递给此方法,但没有任何反应。
  3. 然后我查看了Masstransit的源代码,发现在任何地方都没有调用token.ThrowIfCancellationIsRequested()!
  4. 所以,请告诉我,我在这里做错了,还有另一种处理CancellationTokens的方法,或者它只是一个Masstransit的错误?

1 个答案:

答案 0 :(得分:0)

传递给请求的CancellationToken是取消请求本身,它不会传递给消费者。

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

  1. 将“到期日期”标题添加到“请求”(UtcNow + timeout)
  2. 在Consumer中将ExpiryDate标头与UtcNow进行比较,如果它更旧,则退出方法