Одно событие - несколько потребителей (работает только один потребитель) Rabbitmq - PullRequest
0 голосов
/ 25 мая 2020
MyProject.Core
MyProject.Services.DataImporter
Myproject.Services.Cars
Myproject.Services.Cars2

Оба проекта DataImporter и Cars ссылаются на проект MyProject.Core. У меня есть событие (DataImportFinishedEvent), которое генерируется службой DataImporter. И Services.Cars, и Services.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);
   }
}

Если вам нужна дополнительная информация, я добавляю реализацию RabbitMQBus в обе службы (. net core)

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

Пожалуйста, позвольте я знаю, нужна ли вам дополнительная информация из реализации RabbitMQBus.

1 Ответ

2 голосов
/ 25 мая 2020

Когда вы загружаете сообщение в очередь в RabbitMQ, это сообщение будет использовано только один раз .

Чтобы одно и то же сообщение было использовано несколькими потребителями, вы должны использовать a разветвленный обмен . В прикрепленной ссылке вы можете найти очень описательный пост о том, как работает эта концепция.

В фоновом режиме происходит то, что когда вы загружаете сообщение в обмен, ваше сообщение помещается в несколько очередей. И тогда каждая служба может потреблять собственное сообщение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...