如何在 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
完成。
- 当我尝试将令牌传递给
Request
方法,然后在我的CancellationTokenSource
上调用Cancel()
时,我希望该方法会抛出OperationCancelledException
,但我只是得到响应! - 我也尝试将已经取消的令牌传递给此方法,但没有任何反应。
- 然后我查看了Masstransit的源代码并找到了该令牌。ThrowIfCancelIsRequest() 在任何地方都没有被调用!
所以,请告诉我,我在这里做错了什么,还有另一种处理取消令牌的方法,或者它只是一个公共交通的错误?
传递到请求中的CancellationToken
是取消请求本身,它不会传递给使用者。
我们设法使用以下方法取消消费者:
- 将到期日期标头添加到请求(UtcNow + 超时)
- 在消费者中,将 ExpiryDate 标头与 UtcNow 进行比较,如果它较旧,则退出该方法