У меня есть простой запрос/ответ на запрос masstransit. Он состоит из двух приложений: один для отправки сообщений, а другой для потребления сообщений. Сообщения отправки приложения выглядит следующим образом:Как отменить запрос/ответное сообщение с CancellationToken в MassTransit ESB?
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
, а затем вызватьCancel()
на мойCancellationTokenSource
Я ожидаю, что способ броситьOperationCancelledException
, но я просто получить ответ! - Я также попытался передать уже отмененный токен этому методу, но ничего не произошло.
- Затем я посмотрел исходный код Масстрансита и обнаружил, что токен.ThrowIfCancellationIsRequested() нигде не называется!
Итак, скажите, пожалуйста, я делаю что-то неправильно здесь, и есть другой способ справиться с CancellationTokens, или это просто ошибка Масстрансита?
Вам нужно выбросить это «token.ThrowIfCancellationIsRequested()», в противном случае ваша задача async никогда не узнает, отменена или нет. –
В запросителе вы можете указать тайм-аут, я думаю, что это лучше, чем использование маркеров отмены. Не уверен в отношении потребителя, это просто обычная асинхронная/ждущая там с вашей долгой задачей, не имеющая ничего общего с MassTransit. Я не уверен, имеет ли токен для отказа от рекламы запрос на запросчика. Я считаю, что правильный способ информирования вашего запроса о том, что что-то случилось с потребителем, заключается в том, чтобы отправить правильное ответное сообщение, а не использовать технические данные. –
@x ... Мне не нужно вызывать этот метод, но MassTransit должен, я думаю. –