一个事件多个消费者(只有一个消费者在工作)Rabbitmq
One event multiple consumers (only one consumer working) Rabbitmq
MyProject.Core
MyProject.Services.DataImporter
Myproject.Services.Cars
Myproject.Services.Cars2
DataImporter
和 Cars
项目都引用了 MyProject.Core 项目。我有一个由 DataImporter
服务发出的事件 (DataImportFinishedEvent
)。 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);
}
}
如果您需要更多信息,我将在两种服务(.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 说明此概念的工作原理。
后台发生的事情是,当您在交换中上传一条消息时,您的消息被放置在几个队列中。然后每个服务都可以使用它自己的消息。
MyProject.Core
MyProject.Services.DataImporter
Myproject.Services.Cars
Myproject.Services.Cars2
DataImporter
和 Cars
项目都引用了 MyProject.Core 项目。我有一个由 DataImporter
服务发出的事件 (DataImportFinishedEvent
)。 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);
}
}
如果您需要更多信息,我将在两种服务(.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 说明此概念的工作原理。
后台发生的事情是,当您在交换中上传一条消息时,您的消息被放置在几个队列中。然后每个服务都可以使用它自己的消息。