Files
TaskPool/internal/eventbus/bus.go
T
admin e6956aa001 Initial commit: TaskPool React panel
- React frontend with route-level code splitting
- Backend rebranded from Baihu to TaskPool
- DB brand migration script and local compatibility
2026-07-26 08:43:52 +08:00

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()