【问题标题】:MassTransit & Unity - How can I avoid duplicate messages from being sent to consumers?MassTransit & Unity - 如何避免向消费者发送重复消息?
【发布时间】:2014-02-13 02:17:36
【问题描述】:

我们正在使用 MassTransit/RabbitMQ 和 Unity。我注意到每个消费者两次收到一条消息。我查看了other posts,其他人也在描述这个问题。我很清楚是什么,具体是什么原因。然而,所有的手指似乎都指向了 MT 的 SubScriptionBusConfigurator.LoadFrom(IUnityContainer container) 方法。

我正在向我的 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));

那么注册我的消费者的正确/首选方法是什么,以便消息不会发送给每个消费者两次??

谢谢!!!

【问题讨论】:

    标签: rabbitmq unity-container message-queue servicebus masstransit


    【解决方案1】:

    特定于容器的LoadFrom 做了很多假设。其中一些可能不适合您。

    我建议将调用更改为sbc.Subscribe(s =&gt; container.Resolve&lt;ConsumerA&gt;()) 等。LoadFrom 是一种方便的方法,如果由于某种原因不再方便,请跳过它。

    【讨论】:

    • AutoFact 和 AsSelf().AsImplementedInterfaces() 也发生了同样的事情,系统收到了两倍的消息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多