Skip to content

事件总线

事件总线即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: ..."
}

广州宝点数字化科技