2016-07-15 11 views
2

У меня есть простой запрос/ответ на запрос 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.

  1. Когда я пытаюсь передать маркер метода Request, а затем вызвать Cancel() на мой CancellationTokenSource Я ожидаю, что способ бросить OperationCancelledException, но я просто получить ответ!
  2. Я также попытался передать уже отмененный токен этому методу, но ничего не произошло.
  3. Затем я посмотрел исходный код Масстрансита и обнаружил, что токен.ThrowIfCancellationIsRequested() нигде не называется!

Итак, скажите, пожалуйста, я делаю что-то неправильно здесь, и есть другой способ справиться с CancellationTokens, или это просто ошибка Масстрансита?

+0

Вам нужно выбросить это «token.ThrowIfCancellationIsRequested()», в противном случае ваша задача async никогда не узнает, отменена или нет. –

+0

В запросителе вы можете указать тайм-аут, я думаю, что это лучше, чем использование маркеров отмены. Не уверен в отношении потребителя, это просто обычная асинхронная/ждущая там с вашей долгой задачей, не имеющая ничего общего с MassTransit. Я не уверен, имеет ли токен для отказа от рекламы запрос на запросчика. Я считаю, что правильный способ информирования вашего запроса о том, что что-то случилось с потребителем, заключается в том, чтобы отправить правильное ответное сообщение, а не использовать технические данные. –

+0

@x ... Мне не нужно вызывать этот метод, но MassTransit должен, я думаю. –

ответ

0

CancellationToken, который передается в Запрос, является отмена самого запроса, он не передается потребителю.

Нам удалось отменить Потребителя, используя следующий подход:

  1. Добавить экспирации Дата заголовок запроса (UtcNow + таймаута)
  2. В Потребителя сравнить заголовок ExpiryDate к UtcNow и если он старше выйдите из метода

 Смежные вопросы

  • Нет связанных вопросов^_^