1- package com .talexframe .frame .core .modules .event . service ;
1+ package com .talexframe .frame .core .modules .event ;
22
33import cn .hutool .core .thread .ThreadUtil ;
4- import com .talexframe .frame .core .modules .event .*;
4+ import com .google .common .collect .ArrayListMultimap ;
5+ import com .google .common .collect .Multimap ;
6+ import com .talexframe .frame .core .modules .event .service .IContinue ;
7+ import com .talexframe .frame .core .modules .event .service .IEventBus ;
8+ import com .talexframe .frame .core .modules .event .service .THandler ;
9+ import com .talexframe .frame .core .modules .event .service .TalexEvent ;
510import com .talexframe .frame .core .pojo .enums .ThreadMode ;
611import lombok .Getter ;
712import lombok .extern .slf4j .Slf4j ;
813
914import java .lang .reflect .Method ;
1015import java .lang .reflect .Parameter ;
1116import java .lang .reflect .Type ;
12- import java .util .ArrayList ;
13- import java .util .HashMap ;
14- import java .util .List ;
15- import java .util .Map ;
17+ import java .util .*;
1618
1719/**
1820 * @author TalexDreamSoul
1921 */
2022@ Slf4j
2123public class TalexEventBus implements IEventBus {
2224
23- private static TalexEventBus instance ;
25+ private static TalexEventBus INSTANCE ;
2426
2527 @ Getter
26- private final Map <FrameListener , List <MethodManager >> mapCaches ;
28+ private final Multimap <FrameListener , MethodManager > listenerManager = ArrayListMultimap .create ();
29+
2730 @ Getter
2831 private final Map <String , TalexEvent > continueEvents = new HashMap <>(16 );
2932
3033 private TalexEventBus () {
3134
32- mapCaches = new HashMap <>();
33-
3435 }
3536
3637 public static TalexEventBus getDefault () {
3738
38- if ( instance == null ) {
39+ if ( INSTANCE == null ) {
3940
40- instance = new TalexEventBus ();
41+ INSTANCE = new TalexEventBus ();
4142
42- return instance ;
43+ return INSTANCE ;
4344
4445 }
4546
@@ -50,74 +51,69 @@ public static TalexEventBus getDefault() {
5051 @ Override
5152 public TalexEventBus registerListener (FrameListener listener ) {
5253
53- List < MethodManager > methodsList = mapCaches . get (listener );
54+ if ( listenerManager . containsKey (listener ) ) {
5455
55- if ( methodsList == null || methodsList . size () == 0 ) {
56+ return this ;
5657
57- methodsList = new ArrayList <>();
58+ }
5859
59- Class <?> clazz = listener . getClass ( );
60+ List < MethodManager > methodsList = new ArrayList <>( listenerManager . get ( listener ) );
6061
61- Method [] methods = clazz . getMethods ();
62+ Class <?> clazz = listener . getClass ();
6263
63- for ( Method method : methods ) {
64+ Arrays . asList ( clazz . getMethods () ). forEach (( method ) -> {
6465
65- THandler annotation = method .getAnnotation (THandler .class );
66+ THandler annotation = method .getAnnotation (THandler .class );
6667
67- if ( annotation == null ) {
68- continue ;
69- }
68+ if ( annotation == null ) return ;
7069
71- Type type = method .getGenericReturnType ();
70+ Type type = method .getGenericReturnType ();
7271
73- if ( !"void" .equals (type .toString ()) ) {
74- throw new RuntimeException ( method . getName () + " 返回值类型必须为void类型" );
75- }
72+ if ( !"void" .equals (type .toString ()) ) {
73+
74+ throw new RuntimeException ( method . getName () + " 返回值类型必须为void类型" );
7675
77- Class <?>[] parameterTypes = method . getParameterTypes ();
76+ }
7877
79- if ( parameterTypes . length > 2 ) {
78+ Class <?>[] parameterTypes = method . getParameterTypes ();
8079
81- throw new RuntimeException ( method . getName () + " 参数个数必须 <= 2" );
80+ if ( parameterTypes . length > 2 ) {
8281
83- }
82+ throw new RuntimeException ( method . getName () + " 参数个数必须 <= 2" );
8483
85- MethodManager methodManager = new MethodManager (listener , parameterTypes [0 ],
86- method , annotation );
84+ }
8785
88- methodsList . add ( methodManager );
86+ MethodManager methodManager = new MethodManager ( listener , method , annotation );
8987
90- for ( TalexEvent continueEvent : continueEvents . values () ) {
88+ methodsList . add ( methodManager );
9189
92- this . callEvent ( continueEvent , methodManager );
90+ for ( TalexEvent continueEvent : continueEvents . values () ) {
9391
94- }
92+ this . _callEvent ( continueEvent , methodManager );
9593
9694 }
9795
98- mapCaches . put ( listener , methodsList );
96+ } );
9997
100- }
98+ listenerManager . putAll ( listener , methodsList );
10199
102100 return this ;
103101
104102 }
105103
106- private void callEvent (TalexEvent event , MethodManager methodManager ) {
104+ private void _callEvent (TalexEvent event , MethodManager methodManager ) {
107105
108- if ( methodManager .getParamType ().isAssignableFrom (event .getClass ()) ) {
106+ // 判断 event 参数是否和 continue event 相同
107+ if ( !methodManager .getMethod ().getParameterTypes ()[0 ].isAssignableFrom (event .getClass ()) ) return ;
109108
110- methodManager .listen (( (IContinue ) event ).getMatchKey ());
109+ // execute
110+ if ( methodManager .getTHandler ().threadMode () == ThreadMode .ASYNC ) {
111111
112- if ( methodManager . getTHandler (). threadMode () == ThreadMode . ASYNC ) {
112+ ThreadUtil . execAsync ( () -> event ( event , methodManager ));
113113
114- ThreadUtil . execAsync (() -> event ( event , methodManager ));
114+ } else {
115115
116- } else {
117-
118- event (event , methodManager );
119-
120- }
116+ event (event , methodManager );
121117
122118 }
123119
@@ -126,29 +122,26 @@ private void callEvent(TalexEvent event, MethodManager methodManager) {
126122 @ Override
127123 public TalexEventBus callEvent (TalexEvent event ) {
128124
125+ // 如果是 ContinuouslyEvent 放到 map 中
129126 if ( event instanceof IContinue ) {
130127
131128 String matchKey = ( (IContinue ) event ).getMatchKey ();
132129 continueEvents .put (matchKey , event );
133130
134131 }
135132
136- Map <Integer , MethodManager > preList = new HashMap <>(mapCaches .size ());
137-
138- for ( Map .Entry <FrameListener , List <MethodManager >> entry : mapCaches .entrySet () ) {
133+ // 筛选出匹配的 methodManager
134+ Map <Integer , MethodManager > preList = new HashMap <>();
139135
140- List < MethodManager > methodList = entry . getValue ();
136+ listenerManager . entries (). forEach (( entry ) -> {
141137
142- for ( MethodManager methodManager : methodList ) {
138+ if ( entry . getValue (). getMethod (). getParameterTypes ()[ 0 ]. isAssignableFrom ( event . getClass ()) ) {
143139
144- if ( methodManager . getParamType ().isAssignableFrom ( event . getClass ()) ) {
140+ preList . put ( entry . getKey ().hashCode (), entry . getValue ());
145141
146- preList .put (methodManager .hashCode (), methodManager );
147-
148- }
149142 }
150143
151- }
144+ });
152145
153146 List <MethodManager > pl = new ArrayList <>(preList .values ());
154147
@@ -165,10 +158,14 @@ public TalexEventBus callEvent(TalexEvent event) {
165158
166159 if ( methodManager .getTHandler ().threadMode () == ThreadMode .ASYNC ) {
167160
161+ log .debug ("[Event] Execute async event: {}" , methodManager .getMethod ().getName ());
162+
168163 ThreadUtil .execAsync (() -> event (event , methodManager ));
169164
170165 } else {
171166
167+ log .debug ("[Event] Execute event: {}" , methodManager .getMethod ().getName ());
168+
172169 event (event , methodManager );
173170
174171 }
@@ -208,23 +205,15 @@ private void event(TalexEvent event, MethodManager methodManager) {
208205 String matchKey = ( (IContinue ) event ).getMatchKey ();
209206 continueEvents .put (matchKey , event );
210207
211- methodManager .listen (matchKey );
208+ methodManager .listened (matchKey );
212209
213210 }
214211
215212 if ( methodManager .getTHandler ().once () ) {
216213
217214 FrameListener listener = methodManager .getOwner ();
218215
219- List <MethodManager > methodsList = mapCaches .get (listener );
220-
221- if ( methodsList != null ) {
222-
223- methodsList .remove (methodManager );
224-
225- }
226-
227- mapCaches .put (listener , methodsList );
216+ listenerManager .remove (listener , methodManager );
228217
229218 }
230219
@@ -247,7 +236,7 @@ private void event(TalexEvent event, MethodManager methodManager) {
247236 @ Override
248237 public TalexEventBus unRegisterListener (FrameListener listener ) {
249238
250- mapCaches . remove (listener );
239+ listenerManager . removeAll (listener );
251240
252241 return this ;
253242
0 commit comments