2

MassTransit/RabbitMQ와 Unity를 사용하고 있습니다. 각 소비자가 하나의 메시지를 두 번 받았다는 것을 알았습니다. 나는 other posts을 보았는데, 다른 사람들이이 이슈를 설명하고있다. 나는 무엇이 명확하게 원인인지 구체적으로 밝힙니다. 그러나 모든 손가락은 MT의 SubScriptionBusConfigurator.LoadFrom (IUnityContainer 컨테이너) 메소드를 가리키는 것처럼 보입니다.MassTransit & Unity - 중복 메시지가 소비자에게 전송되는 것을 피하려면 어떻게해야합니까?

나는 그렇게처럼 내 유니티 컨테이너에 여러 소비자를 등록하고 :

:

public class ConsumerA : Consumes<SomeMessage>.All 
{ 
    public void Consume(SomeMessage message) 
    { 
    ... 
    } 
} 

내 서비스 버스 등록은 다음과 같습니다

container.RegisterType<ConsumerA>(); 
container.RegisterType<ConsumerB>(); 
container.RegisterType<ConsumerC>(); 

내 소비자

모두 같은 메시지를 듣고
container.RegisterType<IServiceBus>(new ContainerControlledLifetimeManager(), new InjectionFactory(x => ServiceBusFactory.New(sbc => 
      { 
       sbc.ReceiveFrom("rabbitmq://localhost/service_bus"); 
       sbc.UseRabbitMq(); 
       sbc.UseNLog(); 
       sbc.Subscribe(s => s.LoadFrom(container)); 
       sbc.Subscribe(s => s.Handler<IFault>((context, message) => 
        _logger.Error(string.Format("ServiceBus Fault: {0}", message.FaultType)))); 
      }))); 

주위를 둘러 본 후 내 구독이 문제가되는 것처럼 보입니다.

sbc.Subscribe(s => s.LoadFrom(container)); 

그렇다면 소비자를 등록하여 각 소비자에게 메시지를 두 번 보내지 않는 것은 무엇입니까?

감사합니다 !!!

답변

3

컨테이너 특정 LoadFrom은 많은 가정을합니다. 그들 중 일부는 당신을 위해 틀릴 수도 있습니다.

sbc.Subscribe(s => container.Resolve<ConsumerA>()) 등으로 전화를 변경하시는 것이 좋습니다. LoadFrom은 편리한 방법이며 어떤 이유로 든 더 이상 편리하지 않으면 그냥 건너 뜁니다.

+0

LOL. 고마워요! – Nick

+0

AutoFact 및 AsSelf()에서 동일한 문제가 발생합니다. AsImplementedInterfaces() 시스템에서 메시지가 두 번 표시됩니다. – Miguel