Service: fx miss of events, due to return of RegisterReceiver method before registration is assured

This commit is contained in:
MaMe82 2018-10-31 13:59:40 +01:00
parent cfa23614d9
commit 4a1257e135

View File

@ -67,6 +67,7 @@ func (em *EventManager) RegisterReceiver(filterEventType int64) *EventReceiver {
Ctx: ctx,
Cancel: cancel,
FilterEventType: filterEventType,
waitRegister: make(chan struct{}),
}
@ -74,6 +75,9 @@ func (em *EventManager) RegisterReceiver(filterEventType int64) *EventReceiver {
em.registerReceiver <- er
er.isRegistered = true
// wait till registration is assured
<-er.waitRegister
go func() {
<- er.Ctx.Done() //continue watching and assure unregister as soon as possible if canceled
em.UnregisterReceiver(er)
@ -133,6 +137,8 @@ loop:
em.registeredReceiversMutex.Lock()
em.registeredReceivers[er] = true
fmt.Printf("Registered event receiver type %d, overall receiver count %d\n", er.FilterEventType, len(em.registeredReceivers))
// signal registration by closing wait channel
close(er.waitRegister)
em.registeredReceiversMutex.Unlock()
case er := <- em.unregisterReceiver:
em.registeredReceiversMutex.Lock()
@ -149,6 +155,7 @@ loop:
}
type EventReceiver struct {
waitRegister chan struct{}
isRegistered bool
Ctx context.Context
Cancel context.CancelFunc