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

相关问题