Abp框架中使用分布式事件总线RabbitMq
目前在做一个项目,需要A服务中数据库变化的时候,通知B服务,就需要 分布式事件总线RabbitMq来解决
-
分布式事件总线系统:允许发布和订阅跨应用/服务边界传输的事件. 你可以使用分布式事件总线在微服务或应用程序之间异步发送和接收消息.
- 预定义事件:如果你配置,ABP框架会为实体自动发布创建,更新和删除分布式事件.
发布事件:
.Domain文件中
[DependsOn(
typeof(FileManagementDomainSharedModule)
)]
public class FileManagementDomainModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<AbpDistributedEntityEventOptions>(options =>
{
options.AutoEventSelectors.Add<DeviceAcquisitionIq>();
options.EtoMappings.Add<DeviceAcquisitionIq, IQEto>();
options.AutoEventSelectors.Add<DeviceInspectionIq>();
options.EtoMappings.Add<DeviceInspectionIq, IQEto>();
options.AutoEventSelectors.Add<UserUploadIq>();
options.EtoMappings.Add<UserUploadIq, IQEto>();
options.AutoEventSelectors.Add<PlatformAcquisitionIq>();
options.EtoMappings.Add<PlatformAcquisitionIq, IQEto>();
});
Configure<AbpAutoMapperOptions>(options =>
{
//Add all mappings defined in the assembly of the MyModule class
options.AddMaps<FileManagementDomainModule>();
});
base.ConfigureServices(context);
}
}
订阅事件:
事件类型
有三种预定义的事件类型:
EntityCreatedEto<T>
是实体T
创建后发布.EntityUpdatedEto<T>
是实体T
更新后发布.EntityDeletedEto<T>
是实体T
删除后发布.
public class DeleteIQFileEventHandler : IDistributedEventHandler<EntityDeletedEto<IQEto>>,
ITransientDependency
{
private IServiceScopeFactory _serviceScopeFactory;
private ILogger _logger;
public DeleteIQFileEventHandler(IServiceScopeFactory serviceScopeFactory, ILogger<DeleteIQFileEventHandler> logger)
{
_serviceScopeFactory = serviceScopeFactory;
_logger = logger;
}
public async Task HandleEventAsync(EntityDeletedEto<IQEto> eventData)
{
_logger.LogInformation("删除IQ文件:" + eventData.Entity.AcquisitionId);
try
{
using (var scope = _serviceScopeFactory.CreateScope())
{
var iqEto = eventData.Entity;
var mgr = scope.ServiceProvider.GetRequiredService<IUnitOfWorkManager>();
var repository =
scope.ServiceProvider.GetRequiredService<IIQFileRepository>();
var file = await repository.FindAsync(r => r.AcquisitionId == iqEto.AcquisitionId);
if (file != null)
{
DirectoryInfo dir = new DirectoryInfo(file.DataFile);
if(dir.Exists)
{
dir.Delete(true);
}
await repository.DeleteAsync(file.Id);
}
}
}
catch (Exception ex)
{
_logger.LogInformation("RabbitMq错误信息:" + ex);
}
}
}