From f69fa494eca601f7156337ab61dd17b1aca0135a Mon Sep 17 00:00:00 2001
From: Patrick <dreamlike.sky@foxmail.com>
Date: Mon, 30 Mar 2020 19:06:52 +0800
Subject: [PATCH] add default eventDispatch type and handle eventType is ptr

---
 common/observer/dispatcher/direct_event_dispatcher.go      | 4 ++++
 common/observer/dispatcher/direct_event_dispatcher_test.go | 3 ++-
 common/observer/listenable.go                              | 7 +++++++
 config/base_config.go                                      | 2 +-
 4 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/common/observer/dispatcher/direct_event_dispatcher.go b/common/observer/dispatcher/direct_event_dispatcher.go
index f255bd6c3..412585b79 100644
--- a/common/observer/dispatcher/direct_event_dispatcher.go
+++ b/common/observer/dispatcher/direct_event_dispatcher.go
@@ -43,6 +43,10 @@ func NewDirectEventDispatcher() observer.EventDispatcher {
 }
 
 func (ded *DirectEventDispatcher) Dispatch(event observer.Event) {
+	if event == nil {
+		logger.Warnf("[DirectEventDispatcher] dispatch event nil")
+		return
+	}
 	eventType := reflect.TypeOf(event).Elem()
 	value, loaded := ded.ListenersCache.Load(eventType)
 	if !loaded {
diff --git a/common/observer/dispatcher/direct_event_dispatcher_test.go b/common/observer/dispatcher/direct_event_dispatcher_test.go
index d0b0e828c..557dd1522 100644
--- a/common/observer/dispatcher/direct_event_dispatcher_test.go
+++ b/common/observer/dispatcher/direct_event_dispatcher_test.go
@@ -29,6 +29,7 @@ func TestDirectEventDispatcher_Dispatch(t *testing.T) {
 	ded.AddEventListener(&TestEventListener{})
 	ded.AddEventListener(&TestEventListener1{})
 	ded.Dispatch(&TestEvent{})
+	ded.Dispatch(nil)
 }
 
 type TestEvent struct {
@@ -50,7 +51,7 @@ func (tel *TestEventListener) GetPriority() int {
 }
 
 func (tel *TestEventListener) GetEventType() reflect.Type {
-	return reflect.TypeOf(TestEvent{})
+	return reflect.TypeOf(&TestEvent{})
 }
 
 type TestEventListener1 struct {
diff --git a/common/observer/listenable.go b/common/observer/listenable.go
index 6dced504e..6a5d4e35d 100644
--- a/common/observer/listenable.go
+++ b/common/observer/listenable.go
@@ -18,6 +18,7 @@
 package observer
 
 import (
+	"reflect"
 	"sort"
 	"sync"
 )
@@ -44,6 +45,9 @@ func NewBaseListenable() Listenable {
 // AddEventListener ...
 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()
@@ -72,6 +76,9 @@ func (bl *BaseListenable) AddEventListeners(listenersSlice []EventListener) {
 // RemoveEventListener ...
 func (bl *BaseListenable) RemoveEventListener(listener EventListener) {
 	eventType := listener.GetEventType()
+	if eventType.Kind() == reflect.Ptr {
+		eventType = eventType.Elem()
+	}
 	bl.Mutex.Lock()
 	defer bl.Mutex.Unlock()
 	value, loaded := bl.ListenersCache.Load(eventType)
diff --git a/config/base_config.go b/config/base_config.go
index 74634a5f6..f58138d2e 100644
--- a/config/base_config.go
+++ b/config/base_config.go
@@ -46,7 +46,7 @@ type BaseConfig struct {
 	configCenterUrl     *common.URL
 	prefix              string
 	fatherConfig        interface{}
-	eventDispatcherType string        `yaml:"direct" json:"direct,omitempty"`
+	eventDispatcherType string        `default:"direct" yaml:"event_dispatcher_type" json:"event_dispatcher_type,omitempty"`
 	MetricConfig        *MetricConfig `yaml:"metrics" json:"metrics,omitempty"`
 	fileStream          *bytes.Buffer
 }
-- 
GitLab