2025-05-05 10:30:33 +08:00

67 lines
1.1 KiB
Go

package eventmgr
import (
"admin/lib/xlog"
"encoding/json"
"runtime"
)
type Msg struct {
Event string
Payload []byte
}
type subscriber struct {
name string
topic string
handler func(*Msg)
}
type Mgr struct {
subscribers []*subscriber
broker chan *Msg
}
func NewMgr() *Mgr {
mgr := &Mgr{
subscribers: make([]*subscriber, 0),
broker: make(chan *Msg, 1024),
}
mgr.start()
return mgr
}
func (m *Mgr) start() {
for i := 0; i < runtime.NumCPU(); i++ {
go func() {
for {
select {
case msg := <-m.broker:
for _, sub := range m.subscribers {
if sub.topic == msg.Event {
sub.handler(msg)
}
}
}
}
}()
}
}
func (m *Mgr) Subscribe(name string, topic string, handler func(*Msg)) {
m.subscribers = append(m.subscribers, &subscriber{name: name, topic: topic, handler: handler})
}
func (m *Mgr) Publish(event string, payload any) {
payloadBin, err := json.Marshal(payload)
if err != nil {
panic(err)
}
msg := &Msg{Event: event, Payload: payloadBin}
select {
case m.broker <- msg:
default:
xlog.Errorf("publish event:%v broker is full", event)
}
}