mirror of
https://github.com/yusing/godoxy.git
synced 2025-07-12 09:04:02 +02:00
refactor and fix duplicate notification
This commit is contained in:
parent
d1cb7a5ce4
commit
58cfba7695
3 changed files with 21 additions and 22 deletions
|
@ -192,9 +192,10 @@ func (cfg *Config) initNotification(notifCfg []types.NotificationConfig) (err E.
|
||||||
if len(notifCfg) == 0 {
|
if len(notifCfg) == 0 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
dispatcher := notif.StartNotifDispatcher(cfg.task)
|
||||||
errs := E.NewBuilder("notification providers load errors")
|
errs := E.NewBuilder("notification providers load errors")
|
||||||
for i, notifier := range notifCfg {
|
for i, notifier := range notifCfg {
|
||||||
_, err := notif.RegisterProvider(cfg.task.Subtask("notifier"), notifier)
|
_, err := dispatcher.RegisterProvider(notifier)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,24 +35,21 @@ var (
|
||||||
|
|
||||||
const dispatchErr = "notification dispatch error"
|
const dispatchErr = "notification dispatch error"
|
||||||
|
|
||||||
func init() {
|
func StartNotifDispatcher(parent task.Task) *Dispatcher {
|
||||||
dispatcher = newNotifDispatcher()
|
dispatcher = &Dispatcher{
|
||||||
go dispatcher.start()
|
task: parent.Subtask("notification dispatcher"),
|
||||||
}
|
|
||||||
|
|
||||||
func newNotifDispatcher() *Dispatcher {
|
|
||||||
return &Dispatcher{
|
|
||||||
task: task.GlobalTask("notif dispatcher"),
|
|
||||||
logCh: make(chan *LogMessage),
|
logCh: make(chan *LogMessage),
|
||||||
providers: F.NewSet[Provider](),
|
providers: F.NewSet[Provider](),
|
||||||
}
|
}
|
||||||
}
|
go dispatcher.start()
|
||||||
|
|
||||||
func GetDispatcher() *Dispatcher {
|
|
||||||
return dispatcher
|
return dispatcher
|
||||||
}
|
}
|
||||||
|
|
||||||
func RegisterProvider(configSubTask task.Task, cfg types.NotificationConfig) (Provider, E.Error) {
|
func Notify(msg *LogMessage) {
|
||||||
|
dispatcher.logCh <- msg
|
||||||
|
}
|
||||||
|
|
||||||
|
func (disp *Dispatcher) RegisterProvider(cfg types.NotificationConfig) (Provider, E.Error) {
|
||||||
providerName, ok := cfg["provider"]
|
providerName, ok := cfg["provider"]
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, ErrMissingNotifProvider
|
return nil, ErrMissingNotifProvider
|
||||||
|
@ -69,10 +66,7 @@ func RegisterProvider(configSubTask task.Task, cfg types.NotificationConfig) (Pr
|
||||||
|
|
||||||
provider, err := createFunc(cfg)
|
provider, err := createFunc(cfg)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
dispatcher.providers.Add(provider)
|
disp.providers.Add(provider)
|
||||||
configSubTask.OnCancel("remove provider", func() {
|
|
||||||
dispatcher.providers.Remove(provider)
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
return provider, err
|
return provider, err
|
||||||
default:
|
default:
|
||||||
|
@ -81,7 +75,11 @@ func RegisterProvider(configSubTask task.Task, cfg types.NotificationConfig) (Pr
|
||||||
}
|
}
|
||||||
|
|
||||||
func (disp *Dispatcher) start() {
|
func (disp *Dispatcher) start() {
|
||||||
defer dispatcher.task.Finish("dispatcher stopped")
|
defer func() {
|
||||||
|
disp.providers.Clear()
|
||||||
|
close(disp.logCh)
|
||||||
|
disp.task.Finish("dispatcher stopped")
|
||||||
|
}()
|
||||||
|
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
|
@ -123,7 +121,3 @@ func (disp *Dispatcher) dispatch(msg *LogMessage) {
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
func Notify(msg *LogMessage) {
|
|
||||||
dispatcher.logCh <- msg
|
|
||||||
}
|
|
||||||
|
|
|
@ -22,6 +22,10 @@ func (set Set[T]) Remove(v T) {
|
||||||
set.m.Delete(v)
|
set.m.Delete(v)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (set Set[T]) Clear() {
|
||||||
|
set.m.Clear()
|
||||||
|
}
|
||||||
|
|
||||||
func (set Set[T]) Contains(v T) bool {
|
func (set Set[T]) Contains(v T) bool {
|
||||||
_, ok := set.m.Load(v)
|
_, ok := set.m.Load(v)
|
||||||
return ok
|
return ok
|
||||||
|
|
Loading…
Add table
Reference in a new issue