rabbitmq - MassTransit 和 Unity - 如何避免向消费者发送重复的消息?

标签 rabbitmq unity-container message-queue servicebus masstransit

我们正在使用 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));

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

谢谢!!!

最佳答案

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

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

关于rabbitmq - MassTransit 和 Unity - 如何避免向消费者发送重复的消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21292833/

相关文章:

rabbitmq - 同一交货标签的多次确认

rabbitmq - RabbitMQ接受连接,但在接受任何输入之前将其关闭

c# - 使用 Unity Framework 的依赖类的构造函数参数

java - 延迟对java webservice的多次调用

c# - 如何每 X 秒批量处理来自服务总线队列的消息

c# - RabbitMQ C# API 基于事件的消息消费

RabbitMQ 因凹凸减少内存使用而崩溃

c# - Unity 中的 PerThreadLifetimeManager

c# - 统一: Build up a dictionary

java - 如何在 RBDMS 或 NOSQL 数据存储或其他消息系统(例如 rabbitmq)之上实现类似分布式队列的东西?