2016-07-15 5 views
2

간단한 마스터 전송 요청/응답 개념 증명이 있습니다. 두 개의 앱으로 구성되어 있습니다. 하나는 메시지 전송 용이고 다른 하나는 메시지를 사용하기위한 것입니다. 응용 프로그램을 전송 메시지는 다음과 같이 진행됩니다MassTransit ESB의 CancellationToken으로 요청/응답 통신을 취소하는 방법은 무엇입니까?

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

Request 방법은 두 번째 옵션 매개 변수로 CancellationToken 걸립니다. 우리는 ConsumeContextCancellationToken 필드가 볼 수 있듯이

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

:

메시지 소비자는 다음과 같은 코드가 있습니다.

그래서 질문입니다. 어떻게 이러한 토큰을 사용할 수 있습니까?

내 메시지 전송 응용 프로그램에서 응답을 기다리는 것을 취소하고 메시지 사용자가 _longrunningJob 완료를 기다리고 취소하고 싶습니다.

  1. I가 Cancel()를 호출 한 후 Request 방법에 토큰을 통과하려고

    CancellationTokenSource 나는 방법은 OperationCancelledException를 던져,하지만 난 그냥 응답을 기대합니다!
  2. 이미 취소 된 토큰을이 메서드에 전달하려고했지만 아무 일도 없었습니다.
  3. 그런 다음 Masstransit의 소스 코드를 살펴본 결과 token.ThrowIfCancellationIsRequested()가 아무데도 호출되지 않는다는 것을 알았습니다!

그래서 내가 여기서 잘못된 것을하고 있으며 CancellationTokens를 다루는 또 다른 방법이 있습니까? 아니면 그냥 Masstransit의 버그입니까?

+0

"token.ThrowIfCancellationIsRequested()"를 던져야합니다. 그렇지 않으면 비동기 작업이 취소되었는지 여부를 알 수 없습니다. –

+0

요청자에서 시간 초과를 지정할 수 있습니다. 취소 토큰을 사용하는 것보다 낫다고 생각합니다. 소비자에 대한 확신이 없으므로 장기간의 작업과 MassTransit과는 아무런 관련이 없습니다. 소비자의 취소 토큰이 요청자에 대한 요청을 가지고 있는지 확실하지 않습니다. 요청자에게 소비자에게 일어난 일을 알려주는 적절한 방법은 기술을 사용하는 대신 적절한 응답 메시지를 보내는 것입니다. –

+0

@x ... 그 방법을 호출 할 필요는 없지만 MassTransit이해야한다고 생각합니다. –

답변

0

요청에 전달 된 CancellationToken은 요청 자체를 취소하는 것으로 소비자에게 전달되지 않습니다. UtcNow에 ExpiryDate 헤더를 비교하고 오래된 그 경우 요청 소비자에서 (UtcNow + 시간 초과)

    1. 추가 만료 날짜 헤더 :

      우리는 다음과 같은 방법을 사용하여 소비자를 취소 관리 메소드를 종료하십시오
  • 관련 문제