C# 一个事件多个使用者(只有一个使用者工作)Rabbitmq
C# 一个事件多个使用者(只有一个使用者工作)Rabbitmq,c#,.net,.net-core,rabbitmq,microservices,C#,.net,.net Core,Rabbitmq,Microservices,DataImporter和Cars项目都引用了MyProject.Core项目。我有一个事件(DataImportFinishedEvent)是由DataImporter服务发出的。Services.Cars和Services.Cars2都订阅了此活动 当触发事件时,我能够在服务.Cars中获取此事件,并且在处理事件后,我无法在服务.Cars2中获取它。如果我禁用了Services.Cars,那么我就能够成功获取Services.Cars2上的事件 简而言之,我不能为一个事件拥有多个订阅者,一旦
DataImporter
和Cars
项目都引用了MyProject.Core项目。我有一个事件(DataImportFinishedEvent
)是由DataImporter
服务发出的。Services.Cars
和Services.Cars2
都订阅了此活动
当触发事件时,我能够在服务.Cars
中获取此事件,并且在处理事件后,我无法在服务.Cars2
中获取它。如果我禁用了Services.Cars
,那么我就能够成功获取Services.Cars2
上的事件
简而言之,我不能为一个事件拥有多个订阅者,一旦事件被处理,其他消费者就好像不再存在一样
不确定我应该共享什么代码,但这里是我的事件和事件处理程序的样子
MyProject.Core
MyProject.Services.DataImporter
Myproject.Services.Cars
Myproject.Services.Cars2
公共类DataImportFinishedEvent:事件
{
公共字符串数据{get;set;}
}
公共类DataImportFinishedEventHandler:IEventHandler{
公共任务句柄(DataImportFinishedEvent@event)
{
返回Task.FromResult(true);
}
}
如果您需要更多信息,我将在这两个服务(.net core)中注入RabbitMQBus实现
services.AddSingleton(sp=>
{
var scopeFactory=sp.GetRequiredService();
返回新的RabbitMQBus(sp.GetService(),scopeFactory);
});
如果您需要从
RabbitMQBus
实现获得更多信息,请告诉我。当您在RabbitMQ的队列中上载消息时,该消息将仅被使用一次
为了获得相同的消息供多个消费者使用,您必须使用。在所附的链接中,你可以找到一篇描述这个概念如何运作的文章
在后台发生的情况是,当您在exchange中上载邮件时,您的邮件被放置在多个队列中。然后每个服务都可以使用它自己的消息。当您在RabbitMQ的队列中上载消息时,该消息只会被使用一次 为了获得相同的消息供多个消费者使用,您必须使用。在所附的链接中,你可以找到一篇描述这个概念如何运作的文章 在后台发生的情况是,当您在exchange中上载邮件时,您的邮件被放置在多个队列中。然后每个服务都可以使用自己的消息
public class DataImportFinishedEvent: Event
{
public string Data { get; set; }
}
public class DataImportFinishedEventHandler : IEventHandler<DataImportFinishedEvent> {
public Task Handle(DataImportFinishedEvent @event)
{
return Task.FromResult(true);
}
}
services.AddSingleton<IEventBus, RabbitMQBus>(sp =>
{
var scopeFactory = sp.GetRequiredService<IServiceScopeFactory>();
return new RabbitMQBus(sp.GetService<IMediator>(), scopeFactory);
});