2

我們使用MassTransit/RabbitMQ和Unity。我注意到每個消費者都收到一條消息兩次。我看過other posts其他人也在描述這個問題。我很清楚,具體是什麼原因。但是,所有手指似乎都指向MT的SubScriptionBusConfigurator.LoadFrom(IUnityContainer容器)方法。MassTransit&Unity - 如何避免將重複消息發送給消費者?

我註冊了幾位消費者與我統一容器像這樣:

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

我的消費者都監聽同樣的消息:

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

我的服務總線註冊的樣子:

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

相關問題