2017-10-17 18 views
0

한 쪽에서 일부 메시지를 보내고 다른 응용 프로그램에서 수신하는 RabbitMq가있는 대기열을 만들고 싶습니다. I'am는 다음 코드를 사용하여 이렇게 :Masstransit ReceiveFrom 메소드 및 소비자 행동에 혼동 됨

return ServiceBusFactory.New(x => 
     { 
      var uriString = string.Format(@"rabbitmq://{0}/{1}/{2}?prefetch={3}", host, virtualHost, queueName, 
       prefetch < 1 ? 1 : prefetch); 
      x.UseRabbitMq(r => r.ConfigureHost(new MessageUrn(uriString), h => 
      { 
       h.SetUsername(user); 
       h.SetPassword(password); 
       h.SetRequestedHeartbeat(3); 

      })); 

      x.ReceiveFrom(uriString); 

      x.UseJsonSerializer<ServiceBusConfigurator>(); 

      f(x); 
     }); 

MessageUrn의 URI와 ReceiveFrom 그렇지 않으면 ReceiveFrom 방법에 대해 지정된 URI, 같은 URI가 버스 종점을 결정해야합니다. 하지만 내 출판사도 같은 대기열을 사용하고 있음을 의미합니다. 수신자가 없으면 모든 메시지가 queuename_error 큐로 이동합니다. 수신기가있을 때 모든 것이 괜찮은 것 같습니다.

내가 뭘 잘못하고있어? 왜 메시지가 오류 대기열로 이동하는지 이해합니다. 게시자는 구독하지 않았지만 동시에 소비자이므로 오류 상황이 발생합니다. 수신자가 (다시) 시작할 때 오류 대기열에서 메시지를 복구 할 수 있습니까?

masstransit은 2.10.0.0입니다.

미리 감사드립니다.

+0

masstransit을 <3.0.0 버전으로 업그레이드하는 것이 좋습니다. API가 개선되었습니다. masstransit v3 이상에 대한 문서는 다음과 같습니다. http://masstransit-project.com/MassTransit/ –

+0

이후 버전은 사용할 수 없습니다. – Sharov

답변

2

주소는 각 서비스마다 고유해야하며 서비스에 동일한 메시지 유형이 사용되는 동일한 소비자가있는 경우에만 공유해야합니다. 동일한 RabbitMQ 서버를 사용하는 서비스 간의 유일한 공통점은 호스트 (및 사용되는 경우 가상 호스트)입니다. 그렇지 않으면, 그들은 달라야합니다.

예, 게시자가 구독하지 않았기 때문에 오류 대기열에 들어갑니다. 게시자에게 다른 대기열 이름을 지정하면 문제가 해결됩니다.

+0

답장을 보내 주셔서 감사합니다. 여전히 나는 그것을 얻을 수 없다. 왜 내가 단지 메시지를 보내고 싶다면 ReceiveFrom()을 지정해야 하는가? 왜 ConfigureHost 메서드의 uri가 충분하지 않습니까? 또한 다른 URI 문자열 (ConfigureHost와 ReceiveFrom 중 하나)을 지정하면 메시지가 ReceiveFrom 메서드에서 지정한 대기열로 전송됩니다. 꽤 이상한 ... – Sharov

+0

v2 API의 시대와 진화의 인공물입니다. V3 API는 훨씬 더 의미가 있지만 업그레이드 할 수 없다고 했으므로 문제가 없습니다. –

+0

v3가이를 피할 수 있다면 마이그레이션을 시도 할 것입니다. 나는 그것이 RMQ에 특정한 것이라고 생각했다. – Sharov