67 lines
1.1 KiB
Go
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)
|
||
|
}
|
||
|
}
|