一个事件多个消费者(只有一个消费者在工作)Rabbitmq

One event multiple consumers (only one consumer working) Rabbitmq

MyProject.Core
MyProject.Services.DataImporter
Myproject.Services.Cars
Myproject.Services.Cars2

DataImporterCars 项目都引用了 MyProject.Core 项目。我有一个由 DataImporter 服务发出的事件 (DataImportFinishedEvent)。 Services.CarsServices.Cars2 都订阅了这个事件。

触发事件后,我可以在 Services.Cars 中获取此事件,但在处理事件后,我无法在 Services.Cars2 中获取它。如果我禁用 Services.Cars,那么我就可以成功获取 Services.Cars2 上的事件。

简而言之,一个事件我不能有多个订阅者,一旦事件被处理,其他消费者就好像不再存在了。

不确定我应该分享什么代码,但我的事件和事件处理程序看起来如何。

public class DataImportFinishedEvent: Event
{
   public string Data { get; set; }
}

public class DataImportFinishedEventHandler : IEventHandler<DataImportFinishedEvent> {
   public Task Handle(DataImportFinishedEvent @event)
   {
        return Task.FromResult(true);
   }
}

如果您需要更多信息,我将在两种服务(.net 核心)中注入 RabbitMQBus 实现

 services.AddSingleton<IEventBus, RabbitMQBus>(sp =>
 {
      var scopeFactory = sp.GetRequiredService<IServiceScopeFactory>();
      return new RabbitMQBus(sp.GetService<IMediator>(), scopeFactory);
 });

如果您需要有关 RabbitMQBus 实施的更多信息,请告诉我。

当您在 RabbitMQ 的队列中上传消息时,该消息将被使用仅一次

为了让多个消费者使用相同的消息,您必须使用 fan-out exchange。在随附的 link 中,您可以找到非常详细的 post 说明此概念的工作原理。

后台发生的事情是,当您在交换中上传一条消息时,您的消息被放置在几个队列中。然后每个服务都可以使用它自己的消息。