From 0d237b1a8af0ecb103fc2c1700c6c32b4c2a3f8a Mon Sep 17 00:00:00 2001 From: Patrick <dreamlike.sky@foxmail.com> Date: Thu, 2 Apr 2020 23:37:00 +0800 Subject: [PATCH] modify some comments and optimize code --- common/observer/event_dispatcher.go | 9 ++++++++- common/observer/event_listener.go | 7 ------- common/observer/listenable.go | 31 +++++++++++++++-------------- config/config_loader.go | 4 ++-- 4 files changed, 26 insertions(+), 25 deletions(-) diff --git a/common/observer/event_dispatcher.go b/common/observer/event_dispatcher.go index 259e32b32..8b3950480 100644 --- a/common/observer/event_dispatcher.go +++ b/common/observer/event_dispatcher.go @@ -23,6 +23,8 @@ import ( var globalEventDispatcher EventDispatcher +var allEventListeners []EventListener + // EventDispatcher is align with EventDispatcher interface in Java. // it's the top abstraction // Align with 2.7.5 @@ -53,10 +55,15 @@ func SetAndInitGlobalDispatcher(name string) { panic("EventDispatcher for " + name + " is not existing, make sure you have import the package.") } globalEventDispatcher = dispatchers[name]() - globalEventDispatcher.AddEventListeners(eventListeners) + globalEventDispatcher.AddEventListeners(allEventListeners) } // GetGlobalDispatcher func GetGlobalDispatcher() EventDispatcher { return globalEventDispatcher } + +// AddEventListener it will be added in global event dispatcher +func AddEventListener(listener EventListener) { + allEventListeners = append(allEventListeners, listener) +} diff --git a/common/observer/event_listener.go b/common/observer/event_listener.go index f92f9d2c7..85a6fa22b 100644 --- a/common/observer/event_listener.go +++ b/common/observer/event_listener.go @@ -25,9 +25,6 @@ import ( gxsort "github.com/dubbogo/gost/sort" ) -// All eventListeners -var eventListeners []EventListener - // EventListener is an new interface used to align with dubbo 2.7.5 // It contains the Prioritized means that the listener has its priority type EventListener interface { @@ -44,7 +41,3 @@ type ConditionalEventListener interface { // Accept will make the decision whether it should handle this event Accept(e Event) bool } - -func AddEventListener(listener EventListener) { - eventListeners = append(eventListeners, listener) -} diff --git a/common/observer/listenable.go b/common/observer/listenable.go index 6a5d4e35d..7b64aa8f2 100644 --- a/common/observer/listenable.go +++ b/common/observer/listenable.go @@ -23,6 +23,7 @@ import ( "sync" ) +// Listenable could add and remove the event listener type Listenable interface { AddEventListener(listener EventListener) AddEventListeners(listenersSlice []EventListener) @@ -32,32 +33,31 @@ type Listenable interface { RemoveAllEventListeners() } +// BaseListenable base listenable type BaseListenable struct { Listenable ListenersCache sync.Map Mutex sync.Mutex } +// NewBaseListenable a constructor of base listenable func NewBaseListenable() Listenable { return &BaseListenable{} } -// AddEventListener ... +// AddEventListener add event listener func (bl *BaseListenable) AddEventListener(listener EventListener) { eventType := listener.GetEventType() if eventType.Kind() == reflect.Ptr { eventType = eventType.Elem() } - var listenersSlice []EventListener bl.Mutex.Lock() defer bl.Mutex.Unlock() - if value, loaded := bl.ListenersCache.LoadOrStore(eventType, make([]EventListener, 0, 8)); loaded { - listenersSlice = value.([]EventListener) - if containListener(listenersSlice, listener) { - return - } - } else { - listenersSlice = make([]EventListener, 0, 8) + value, loaded := bl.ListenersCache.LoadOrStore(eventType, make([]EventListener, 0, 8)) + listenersSlice := value.([]EventListener) + // return if listenersSlice already has this listener + if loaded && containListener(listenersSlice, listener) { + return } listenersSlice = append(listenersSlice, listener) sort.Slice(listenersSlice, func(i, j int) bool { @@ -66,14 +66,14 @@ func (bl *BaseListenable) AddEventListener(listener EventListener) { bl.ListenersCache.Store(eventType, listenersSlice) } -// AddEventListeners .. +// AddEventListeners add the slice of event listener func (bl *BaseListenable) AddEventListeners(listenersSlice []EventListener) { for _, listener := range listenersSlice { bl.AddEventListener(listener) } } -// RemoveEventListener ... +// RemoveEventListener remove the event listener func (bl *BaseListenable) RemoveEventListener(listener EventListener) { eventType := listener.GetEventType() if eventType.Kind() == reflect.Ptr { @@ -94,21 +94,21 @@ func (bl *BaseListenable) RemoveEventListener(listener EventListener) { bl.ListenersCache.Store(eventType, listenersSlice) } -// RemoveEventListeners ... +// RemoveEventListeners remove the slice of event listener func (bl *BaseListenable) RemoveEventListeners(listenersSlice []EventListener) { for _, listener := range listenersSlice { bl.RemoveEventListener(listener) } } -// RemoveAllEventListeners ... +// RemoveAllEventListeners remove all func (bl *BaseListenable) RemoveAllEventListeners() { bl.Mutex.Lock() defer bl.Mutex.Unlock() - bl.ListenersCache = *new(sync.Map) + bl.ListenersCache = sync.Map{} } -// GetAllEventListeners ... +// GetAllEventListeners get all func (bl *BaseListenable) GetAllEventListeners() []EventListener { allListenersSlice := make([]EventListener, 0, 16) bl.ListenersCache.Range(func(_, value interface{}) bool { @@ -122,6 +122,7 @@ func (bl *BaseListenable) GetAllEventListeners() []EventListener { return allListenersSlice } +// containListener true if contain listener func containListener(listenersSlice []EventListener, listener EventListener) bool { for _, loadListener := range listenersSlice { if loadListener == listener { diff --git a/config/config_loader.go b/config/config_loader.go index 8e2782e4a..b2ae9d2cc 100644 --- a/config/config_loader.go +++ b/config/config_loader.go @@ -19,7 +19,6 @@ package config import ( "fmt" - "github.com/apache/dubbo-go/common/observer" "log" "os" "time" @@ -34,6 +33,7 @@ import ( "github.com/apache/dubbo-go/common/constant" "github.com/apache/dubbo-go/common/extension" "github.com/apache/dubbo-go/common/logger" + "github.com/apache/dubbo-go/common/observer" _ "github.com/apache/dubbo-go/common/observer/dispatcher" ) @@ -101,7 +101,7 @@ func Load() { if providerConfig != nil { eventDispatcherType = providerConfig.eventDispatcherType } - // init EventDispatcher + // init EventDispatcher should before everything observer.SetAndInitGlobalDispatcher(eventDispatcherType) // reference config -- GitLab