e6956aa001
- React frontend with route-level code splitting - Backend rebranded from Baihu to TaskPool - DB brand migration script and local compatibility
51 lines
1.0 KiB
Go
51 lines
1.0 KiB
Go
package eventbus
|
|
|
|
import "sync"
|
|
|
|
// Event 统一定义的事件体内包含的数据
|
|
type Event struct {
|
|
Type string
|
|
Payload interface{}
|
|
}
|
|
|
|
// Handler 事件具体的执行句柄
|
|
type Handler func(event Event)
|
|
|
|
// Subscriber 事件订阅者接口,各业务 Service 若关注系统总线可实现此接口
|
|
type Subscriber interface {
|
|
SubscribeEvents(bus *EventBus)
|
|
}
|
|
|
|
type EventBus struct {
|
|
handlers map[string][]Handler
|
|
mu sync.RWMutex
|
|
}
|
|
|
|
func New() *EventBus {
|
|
return &EventBus{
|
|
handlers: make(map[string][]Handler),
|
|
}
|
|
}
|
|
|
|
// Subscribe 注册订阅事件
|
|
func (bus *EventBus) Subscribe(eventType string, handler Handler) {
|
|
bus.mu.Lock()
|
|
defer bus.mu.Unlock()
|
|
bus.handlers[eventType] = append(bus.handlers[eventType], handler)
|
|
}
|
|
|
|
// Publish 异步抛出事件
|
|
func (bus *EventBus) Publish(event Event) {
|
|
bus.mu.RLock()
|
|
handlers := bus.handlers[event.Type]
|
|
bus.mu.RUnlock()
|
|
|
|
for _, handler := range handlers {
|
|
// 采用 Goroutine 异步不阻塞核心主线
|
|
go handler(event)
|
|
}
|
|
}
|
|
|
|
// 全局唯一的事件总线实例
|
|
var DefaultBus = New()
|