gf
gf copied to clipboard
feat(os/gevent): Add gevent package for event-driven architecture support
实现了GoFrame框架的事件总线模块(gevent),提供了一种解耦组件间通信的机制。该模块支持事件优先级、并行处理、错误处理策略等。
主要特性
-
事件总线(Event Bus):
- 实现了顺序事件总线(SeqEventBus)
- 支持多个订阅者订阅同一主题
- 提供默认事件总线实例
-
事件(Event):
- 基础事件接口和实现
- 支持自定义事件工厂函数
- 包含主题、数据、错误处理模式和执行模式等属性
-
优先级处理:
- 5个优先级级别(PriorityImmediate, PriorityUrgent, PriorityHigh, PriorityNormal, PriorityLow)
- 相同优先级按订阅顺序处理
-
执行模式:
- 顺序执行(Seq)
- 并行执行(Parallel)
-
错误处理:
- Stop模式: 出错时停止后续处理
- Ignore模式: 忽略错误继续处理
-
订阅管理:
- 支持订阅和取消订阅
- 自动清理无订阅者的主题
-
其他特性:
- 支持自定义事件工厂函数
- 线程安全
- 优雅关闭机制
使用示例
基础用法
可以使用DefaultEventBusy也可以使用gevent.New()创建自己的EventBus
// 订阅事件
subscriber, err := gevent.DefaultEventBus.Subscribe("user.registered", func(e gevent.Event) error {
fmt.Println("处理用户注册事件:", e.GetData())
return nil
}, nil, nil)
// 发布事件
params := map[string]any{"userId": 12345, "username": "john"}
ok, err := gevent.DefaultEventBus.Publish("user.registered", params, gevent.Ignore, gevent.Seq)
并行处理
// 订阅多个处理器
gevent.DefaultEventBus.Subscribe("order.created", func(e gevent.Event) error {
// 发送邮件
return nil
}, nil, nil)
gevent.DefaultEventBus.Subscribe("order.created", func(e gevent.Event) error {
// 更新库存
return nil
}, nil, nil)
// 并行执行
params := map[string]any{"orderId": "ORD-12345"}
gevent.DefaultEventBus.Publish("order.created", params, gevent.Ignore, gevent.Parallel)
优先级处理
// 高优先级处理器
gevent.DefaultEventBus.Subscribe("payment.success", handler1, nil, nil, gevent.PriorityHigh)
// 低优先级处理器
gevent.DefaultEventBus.Subscribe("payment.success", handler2, nil, nil, gevent.PriorityLow)