Appearance
事件总线
事件总线即MQ的包装实现
分类:
- 内存事件总线
- RabbitMQ事件总线
使用步骤
- 在公共类(例如Common)中定义总线事件:
c#
[EventBus(Key = nameof(TestEvent))]
public class TestEvent : IEventBusEvent
{
//......此处定义要传输的属性
}- 在项目根目录创建EventBus文件夹,用于定义事件处理类:
Memory:延迟队列,根据发布事件时的延迟时间参数确定。
RabbitMQ:延迟队列,需设置:HandlerType = HandlerType.Delay
c#
/// <summary>
/// 团购核销推送 - OpenApi推送消息Handler
/// </summary>
[EventBus(HandlerName = "事件名字", HandlerType = HandlerType.Delay)]
public class TestEventHandler : IEventBusHandler<TestEvent>
{
public void Execute(TestEvent evt)
{
}
}- 在Package中,注册该处理类:
c#
//加载事件总线
public override void OnMounted(IApplication application, IServiceProvider serviceProvider)
{
var provider = serviceProvider.CreateScope().ServiceProvider;
var eventBusFactory = IocManager.Instance.RootServices.GetRequiredService<IEventBusFactory>();
eventBusFactory.Subscribe<TestEvent, TestEventHandler>(provider);
}事件队列类型
公用队列
所有发布的事件放在同一个队列内,按照发布顺序处理。
c#
// 定义
[EventBus(Key = "CommonEvent")]
public class CommonEvent : IEventBusEvent
{
public string Name { get; set; } = string.Empty;
}
[EventBus(HandlerType = HandlerType.Common)]
public class CommonHandler : IEventBusHandler<CommonEvent>
{
public void Execute(CommonEvent evt)
{
Debug.WriteLine($"执行延迟事件:{DateTime.Now}:{evt.ToJsonString()}");
}
}
// 订阅
_defaultFactory.Subscribe<CommonEvent, CommonHandler>(_serviceProvider);
// 发布
_defaultFactory.Publish(new CommonEvent() { Name = "张三" });延迟队列
所有发布的事件放在同一个队列内。
c#
// 定义
[EventBus(Key = "DelayEvent")]
public class DelayEvent : IEventBusEvent
{
public string Name { get; set; } = string.Empty;
}
[EventBus(HandlerType = HandlerType.Delay)]
public class DelayHandler : IEventBusHandler<DelayEvent>
{
public void Execute(DelayEvent evt)
{
Debug.WriteLine($"执行延迟事件:{DateTime.Now}:{evt.ToJsonString()}");
}
}
// 订阅
_defaultFactory.Subscribe<DelayEvent, DelayHandler>(_serviceProvider);
// 发布
_defaultFactory.Publish(new DelayEvent() { Name = "张三" }, options => options.DelaySeconds = 5);独享队列
每个事件都有自己的队列,每个队列按照发布顺序处理。
c#
// 定义
[EventBus(Key = "ExclusiveEvent")]
public class ExclusiveEvent : IEventBusEvent
{
public string Name { get; set; } = string.Empty;
}
[EventBus(HandlerType = HandlerType.Exclusive)]
public class ExclusiveHandler : IEventBusHandler<ExclusiveEvent>
{
public void Execute(ExclusiveEvent evt)
{
Debug.WriteLine($"执行独享事件:{evt.ToJsonString()}");
}
}
// 订阅
_defaultFactory.Subscribe<ExclusiveEvent, ExclusiveHandler>(_serviceProvider);
// 发布
_defaultFactory.Publish(new ExclusiveEvent() { Name = "张三" });事件总线引擎
Memory引擎 [默认引擎]
特性:内存引擎,没有持久化特性,数据保存在内存内,如果重启,消息则丢失。
json
{
"EventBus": {
"Type": "Memory",
"EnableNofity": true // 默认为true,是否启用数据库通知
}
}RabbitMQ引擎
特性:RabbitMQ引擎,使用的是阿里云RabbitMQ。
json
{
"EventBus": {
"Type": "RabbitMQ",
"RabbitMQ": {
"UserName": "用户账号",
"Password": "用户密码",
"HostName": "服务器",
"VHost": "虚拟主机"
}
}
}日志
可根据发布时的MessageId 和 执行的MessageId 来查询时间处理日志。
发布事件后记录日志:
json
{
"type": "MemoryEventBus",
"title": "发布独享事件",
"channel": "MemoryEventBus",
"messageId": "90622cad-d8a2-4401-811e-9453b72d16f7",
"useTimeMs": 0,
"success": false,
"msg": "{\"messageId\":\"90622cad-d8a2-4401-811e-9453b72d16f7\",\"publishTime\":\"2025-11-20 16:51:07.623\",\"eventArgs\":\"{\\\"name\\\":\\\"张三\\\"}\",\"chainId\":0,\"shopId\":0,\"delaySeconds\":0,\"publishMode\":0}",
"desc": ""
}执行事件成功后日志:
json
{
"type": "MemoryEventBus",
"title": "执行独享队列调用成功: QueueName:ExclusiveHandler.ExclusiveEvent.exclusive",
"channel": "MemoryEventBus",
"messageId": "90622cad-d8a2-4401-811e-9453b72d16f7",
"useTimeMs": 1,
"success": true,
"msg": "{\"name\":\"张三\"}",
"desc": ""
}执行事件失败后日志:
json
{
"type": "Invoke",
"title": "执行独享队列调用失败: QueueName:ExclusiveHandler.ExclusiveEvent.exclusive",
"channel": "MemoryEventBus",
"messageId": "d92781d8-eefb-4df7-bba9-4af93c5c6322",
"useTimeMs": 117,
"success": false,
"msg": "{\"name\":\"张三\"}",
"desc": "System.Reflection.TargetInvocationException: ..."
}