2016-12-02 4 views
0

현재 MassTransit에 대해 NServiceBus을 교환 중이며 요청/응답 패턴에 약간의 어려움이 있습니다.MassTransit 동일한 대기열에 응답하여 루프가 발생합니다.

에서 나는 Handler에 회신을 할 수 있으며이를 보낸 클라이언트로 돌아갑니다. 응답이 때문에 루프를 만드는에서 소비 된 것을 대기열로 다시 전송되는 것처럼 MassTransit에서

, 그것은 ... 나타납니다

이상한 것은, 내가 InMemory를 사용하여 버스를 만드는거야 경우, 그리고 같은 컴퓨터에서 클라이언트와 소비자 모두에게 문제가 없습니다.

나는 응답을 잡으려고 내 클라이언트를 기대하고 있지만, 대신 그 메시지 유형을받을 설치하지이기 때문에, 또한 홀수 내 Consumer 후비는 그것을는 ...

나는 클라이언트에서 뭔가를 놓치고 있습니까 설정을 요청 하시겠습니까?

클라이언트 :

.... 
IRequestClient<IWorklistRequest, IWorklistResponse> client = CreateRequestClient(busControl, WorklistEndpointUri); 

Console.Write("Sending Request"); 

Task.Run(async() => 
{ 
    IWorklistRequest request = new WorklistRequest 
    { 
     CurrentDateFrom = new DateTime(2016, 11, 07) 
    }; 

    var response = await client.Request(request); 

    Console.WriteLine("Worklist Items retrieved: {0}", response.ExamItemList.Length); 

}).Wait(); 
.... 



static IRequestClient<IWorklistRequest, IWorklistResponse> CreateRequestClient(IBusControl busControl, string endpointAddress) 
{ 
    Console.WriteLine("Creating Request client..."); 

    var serviceAddress = new Uri(endpointAddress); 
    IRequestClient<IWorklistRequest, IWorklistResponse> client = 
    busControl.CreateRequestClient<IWorklistRequest, IWorklistResponse>(serviceAddress, TimeSpan.FromSeconds(10)); 

    return client; 
} 

소비자 :

public Task Consume(ConsumeContext<IWorklistRequest> context) 
    { 
     _log.InfoFormat("Received Worklist Request with Id: {0}", context.RequestId); 


     try 
     { 
      var result = _provider.GetAllWorklistsByStartDate(context.Message.CurrentDateFrom); 

      IWorklistResponse response = new WorklistResponse 
      { 
       ExamItemList = result.ToArray() 
      }; 

      // the below is sending the response right back to the original queue and is getting picked up again by this same consumer 
      context.Respond(response); 
     } 
     catch (Exception ex) 
     { 
      _log.Info(ex.Message); 
     } 

     return Task.FromResult(0); 
    } 

답변

1

것은 당신이 RabbitMQ를 사용하고, 당신이 요청 클라이언트를 사용하는 경우, 당신은이 동작을 볼 수 없습니다해야 .

이는 MassTransit GitHub의 저장소에 요청 클라이언트를 사용하는 방법을 보여주는 샘플입니다 : https://github.com/MassTransit/Sample-RequestResponse

위의 코드는 올바른 것으로 나타나고 Respond() 호출 요청 메시지의 응답 주소를 사용해야하는 임시 버스 주소로 보내는 직접 엔드 포인트입니다.

이 영역 주변에는 상당히 광범위한 단위 테스트 적용 범위가 있으며 위의 샘플은 최신 버전의 MassTransit으로 업데이트되고 확인되었습니다. RabbitMQ 가상 호스트 삭제/재 작성 및 처음부터 응용 프로그램 실행 (응답 서비스를 먼저 시작하여 끝점을 설정하는 방법)을 고려해보십시오.

+0

그래, 실제 구현을 안내하기 위해 실제로 작업 한 샘플은 ... RabbitMq 호스트를 다시 만들면 NServiceBus와 함께 사용했던 기존의 것임을 알 수 있습니다. – ragerory

+0

RabbitMQ 호스트를 삭제하고 다시 작성했지만 여전히 문제가 지속됩니다. 그것은 응답 엔드 포인트를 찾을 수 없다는 것입니다. 클라이언트와 버스가 같은 시스템에있을 때 이것은 문제가되지 않습니다. – ragerory

+0

두 서비스가 동일한 주소를 사용하여 RabbitMQ에 연결되어 있습니까? 아니면 그들 중 하나가 다른 호스트 주소를 사용하고 있습니까? 예를 들어 하나는 로컬 호스트를 사용하고 다른 하나는 네트워크 이름을 사용합니까? 또한 RabbitMQ와 함께 원격으로 게스트 계정을 사용하지 마십시오. –

관련 문제