Skip to content

Commit 95a1b72

Browse files
Merge pull request #9 from Talexs/develop
Develop
2 parents 64790f6 + 82fc8db commit 95a1b72

61 files changed

Lines changed: 628 additions & 500 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/main/java/com/talexframe/frame/core/function/command/frame/StopCmd.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.talexframe.frame.core.function.command.frame;
22

3+
import com.talexframe.frame.TalexFrameApplication;
34
import com.talexframe.frame.core.function.command.BaseCommand;
45
import com.talexframe.frame.core.function.command.ISender;
56
import com.talexframe.frame.core.talex.TFrame;
@@ -20,7 +21,11 @@ public StopCmd() {
2021
@Override
2122
public boolean executeCommand(ISender sender, String wholeCommand, String matchedLabel, String[] args) {
2223

23-
tframe.shutdown();
24+
if ( TalexFrameApplication.context != null ) {
25+
26+
TalexFrameApplication.context.stop();
27+
28+
}
2429

2530
return false;
2631

src/main/java/com/talexframe/frame/core/function/listener/FrameMajorListener.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ public void onStopped(ContextStoppedEvent event) {
8484
@EventListener
8585
public void onStopped(ContextClosedEvent event) {
8686

87+
TFrame.tframe.shutdown();
88+
8789
log.warn("框架已停止.");
8890

8991
TFrame.tframe.callEvent(new FramePostUnInstallEvent(System.nanoTime() - TalexFrameApplication.startedTimeStamp));

src/main/java/com/talexframe/frame/core/function/listener/FrameSelfListener.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.talexframe.frame.core.function.listener;
22

33
import com.talexframe.frame.core.modules.event.FrameListener;
4-
import com.talexframe.frame.core.modules.event.THandler;
4+
import com.talexframe.frame.core.modules.event.service.THandler;
55
import com.talexframe.frame.core.modules.event.events.dao.DAOProcessorPreShutdownEvent;
66
import com.talexframe.frame.core.modules.repository.TRepo;
77
import com.talexframe.frame.core.modules.repository.TRepoPlus;

src/main/java/com/talexframe/frame/core/modules/application/TAppManager.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import com.talexframe.frame.core.modules.event.events.app.AppPostRegisterEvent;
44
import com.talexframe.frame.core.modules.event.events.app.AppPreRegisterEvent;
55
import com.talexframe.frame.core.modules.event.events.app.AppUnRegisteredEvent;
6-
import com.talexframe.frame.core.modules.network.connection.RequestAnalyser;
76
import com.talexframe.frame.core.modules.network.interfaces.IUnRegisterHandler;
87
import com.talexframe.frame.core.modules.plugins.core.WebPlugin;
98
import com.talexframe.frame.core.modules.repository.TRepo;
@@ -64,7 +63,7 @@ public boolean registerController(WebPlugin plugin, TApp controller) {
6463

6564
AppPreRegisterEvent event = new AppPreRegisterEvent(plugin, controller);
6665

67-
TFrame.tframe.callEvent(new AppPostRegisterEvent(plugin, controller));
66+
TFrame.tframe.callEvent(event);
6867

6968
if( event.isCancelled() ) return false;
7069

src/main/java/com/talexframe/frame/core/modules/event/MethodManager.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.talexframe.frame.core.modules.event;
22

3+
import com.talexframe.frame.core.modules.event.service.THandler;
34
import lombok.Getter;
45
import lombok.Setter;
56

@@ -16,22 +17,21 @@ public class MethodManager {
1617
private final FrameListener owner;
1718
@Getter
1819
private final Map<String, Long> listenedEvents = new HashMap<>();
19-
private Class<?> paramType;
20+
2021
private Method method;
2122
@Setter
2223
@Getter
2324
private THandler tHandler;
2425

25-
public MethodManager(FrameListener listener, Class<?> paramType, Method method, THandler tHandler) {
26+
public MethodManager(FrameListener listener, Method method, THandler tHandler) {
2627

2728
this.owner = listener;
28-
this.paramType = paramType;
2929
this.method = method;
3030
this.tHandler = tHandler;
3131

3232
}
3333

34-
public void listen(String key) {
34+
public void listened(String key) {
3535

3636
if ( listenedEvents.containsKey(key) ) {
3737

@@ -43,10 +43,6 @@ public void listen(String key) {
4343

4444
}
4545

46-
public Class<?> getParamType() {return paramType;}
47-
48-
public void setParamType(Class<?> paramType) {this.paramType = paramType;}
49-
5046
public Method getMethod() {return method;}
5147

5248
public void setMethod(Method method) {this.method = method;}
Lines changed: 254 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,254 @@
1+
package com.talexframe.frame.core.modules.event;
2+
3+
import cn.hutool.core.thread.ThreadUtil;
4+
import cn.hutool.json.JSONUtil;
5+
import com.google.common.collect.ArrayListMultimap;
6+
import com.google.common.collect.Multimap;
7+
import com.talexframe.frame.core.modules.event.service.IContinue;
8+
import com.talexframe.frame.core.modules.event.service.IEventBus;
9+
import com.talexframe.frame.core.modules.event.service.THandler;
10+
import com.talexframe.frame.core.modules.event.service.TalexEvent;
11+
import com.talexframe.frame.core.pojo.enums.ThreadMode;
12+
import lombok.Getter;
13+
import lombok.extern.slf4j.Slf4j;
14+
15+
import java.lang.reflect.Method;
16+
import java.lang.reflect.Parameter;
17+
import java.lang.reflect.Type;
18+
import java.util.*;
19+
20+
/**
21+
* @author TalexDreamSoul
22+
*/
23+
@Slf4j
24+
public class TalexEventBus implements IEventBus {
25+
26+
private static TalexEventBus INSTANCE;
27+
28+
@Getter
29+
private final Multimap<FrameListener, MethodManager> listenerManager = ArrayListMultimap.create();
30+
31+
@Getter
32+
private final Map<String, TalexEvent> continueEvents = new HashMap<>(16);
33+
34+
private TalexEventBus() {
35+
36+
}
37+
38+
public static TalexEventBus getDefault() {
39+
40+
if ( INSTANCE == null ) {
41+
42+
INSTANCE = new TalexEventBus();
43+
44+
return INSTANCE;
45+
46+
}
47+
48+
return null;
49+
50+
}
51+
52+
@Override
53+
public TalexEventBus registerListener(FrameListener listener) {
54+
55+
if( listenerManager.containsKey(listener) ) {
56+
57+
return this;
58+
59+
}
60+
61+
List<MethodManager> methodsList = new ArrayList<>(listenerManager.get(listener));
62+
63+
Class<?> clazz = listener.getClass();
64+
65+
Arrays.asList( clazz.getMethods() ).forEach((method) -> {
66+
67+
THandler annotation = method.getAnnotation(THandler.class);
68+
69+
if ( annotation == null ) return;
70+
71+
Type type = method.getGenericReturnType();
72+
73+
if ( !"void".equals(type.toString()) ) {
74+
75+
throw new RuntimeException(method.getName() + " 返回值类型必须为void类型");
76+
77+
}
78+
79+
Class<?>[] parameterTypes = method.getParameterTypes();
80+
81+
if ( parameterTypes.length > 2 ) {
82+
83+
throw new RuntimeException(method.getName() + " 参数个数必须 <= 2");
84+
85+
}
86+
87+
MethodManager methodManager = new MethodManager(listener, method, annotation);
88+
89+
methodsList.add(methodManager);
90+
91+
for ( TalexEvent continueEvent : continueEvents.values() ) {
92+
93+
this._callEvent(continueEvent, methodManager);
94+
95+
}
96+
97+
});
98+
99+
listenerManager.putAll(listener, methodsList);
100+
101+
return this;
102+
103+
}
104+
105+
private void _callEvent(TalexEvent event, MethodManager methodManager) {
106+
107+
// 判断 event 参数是否和 continue event 相同
108+
if( !methodManager.getMethod().getParameterTypes()[0].isAssignableFrom(event.getClass()) ) return;
109+
110+
log.debug("[Event] For _event: {} | {}", event, JSONUtil.toJsonStr(methodManager));
111+
112+
// execute
113+
if ( methodManager.getTHandler().threadMode() == ThreadMode.ASYNC ) {
114+
115+
ThreadUtil.execAsync(() -> event(event, methodManager));
116+
117+
} else {
118+
119+
event(event, methodManager);
120+
121+
}
122+
123+
}
124+
125+
@Override
126+
public TalexEventBus callEvent(TalexEvent event) {
127+
128+
// 如果是 ContinuouslyEvent 放到 map 中
129+
if ( event instanceof IContinue ) {
130+
131+
String matchKey = ( (IContinue) event ).getMatchKey();
132+
continueEvents.put(matchKey, event);
133+
134+
log.debug("[Event] For continuously event: {} | {}", event, JSONUtil.toJsonStr(continueEvents));
135+
136+
}
137+
138+
// 筛选出匹配的 methodManager
139+
Map<Integer, MethodManager> preList = new HashMap<>();
140+
141+
listenerManager.entries().forEach((entry) -> {
142+
143+
if( entry.getValue().getMethod().getParameterTypes()[0].isAssignableFrom(event.getClass()) ) {
144+
145+
preList.put(entry.getKey().hashCode(), entry.getValue());
146+
147+
}
148+
149+
});
150+
151+
log.debug("[Event] For event preList: {}", preList);
152+
153+
List<MethodManager> pl = new ArrayList<>(preList.values());
154+
155+
pl.sort((o1, o2) -> {
156+
157+
THandler ts1 = o1.getTHandler();
158+
THandler ts2 = o2.getTHandler();
159+
160+
return Integer.compare(ts1.priority().getLevel(), ts2.priority().getLevel());
161+
162+
});
163+
164+
for ( MethodManager methodManager : pl ) {
165+
166+
if ( methodManager.getTHandler().threadMode() == ThreadMode.ASYNC ) {
167+
168+
log.debug("[Event] Execute async event: {}", methodManager.getMethod().getName());
169+
170+
ThreadUtil.execAsync(() -> event(event, methodManager));
171+
172+
} else {
173+
174+
log.debug("[Event] Execute event: {}", methodManager.getMethod().getName());
175+
176+
event(event, methodManager);
177+
178+
}
179+
180+
}
181+
182+
return this;
183+
184+
}
185+
186+
private void event(TalexEvent event, MethodManager methodManager) {
187+
188+
Method method = methodManager.getMethod();
189+
190+
log.debug("[Event] --> Invoke: " + event.getClass().getName() + " | " + method.getName() + " <> " + methodManager.getOwner().getClass().getName());
191+
192+
try {
193+
194+
List<Object> objs = new ArrayList<>();
195+
196+
objs.add(event);
197+
198+
for ( Parameter parameter : method.getParameters() ) {
199+
200+
if ( parameter.getType().isInstance(MethodManager.class) ) {
201+
202+
objs.add(methodManager);
203+
204+
}
205+
206+
}
207+
208+
method.invoke(methodManager.getOwner(), objs.toArray(new Object[0]));
209+
210+
if ( event instanceof IContinue ) {
211+
212+
String matchKey = ( (IContinue) event ).getMatchKey();
213+
continueEvents.put(matchKey, event);
214+
215+
methodManager.listened(matchKey);
216+
217+
}
218+
219+
if ( methodManager.getTHandler().once() ) {
220+
221+
FrameListener listener = methodManager.getOwner();
222+
223+
listenerManager.remove(listener, methodManager);
224+
225+
}
226+
227+
} catch ( Exception e ) {
228+
229+
if ( e.getCause() == null ) {
230+
231+
log.error("[事件] 在调用 " + method.getName() + " 时, 目标抛出异常" + " @" + method.getDeclaringClass().getName() + "." + method.getName());
232+
233+
} else {
234+
log.error("[事件] 在调用 " + method.getName() + " 时, 目标抛出异常: " + e.getCause().getMessage() + " @" + method.getDeclaringClass().getName() + "." + method.getName());
235+
}
236+
237+
e.printStackTrace();
238+
239+
}
240+
241+
}
242+
243+
@Override
244+
public TalexEventBus unRegisterListener(FrameListener listener) {
245+
246+
listenerManager.removeAll(listener);
247+
248+
return this;
249+
250+
}
251+
252+
}
253+
254+

src/main/java/com/talexframe/frame/core/modules/event/events/app/AppPostRegisterEvent.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.talexframe.frame.core.modules.event.events.app;
22

33
import com.talexframe.frame.core.modules.application.TApp;
4-
import com.talexframe.frame.core.modules.event.TalexEvent;
4+
import com.talexframe.frame.core.modules.event.service.TalexEvent;
55
import com.talexframe.frame.core.modules.plugins.core.WebPlugin;
66
import lombok.Getter;
77

src/main/java/com/talexframe/frame/core/modules/event/events/app/AppPreRegisterEvent.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package com.talexframe.frame.core.modules.event.events.app;
22

33
import com.talexframe.frame.core.modules.application.TApp;
4-
import com.talexframe.frame.core.modules.event.Cancellable;
5-
import com.talexframe.frame.core.modules.event.TalexEvent;
4+
import com.talexframe.frame.core.modules.event.service.Cancellable;
5+
import com.talexframe.frame.core.modules.event.service.TalexEvent;
66
import com.talexframe.frame.core.modules.plugins.core.WebPlugin;
77
import lombok.Getter;
88

src/main/java/com/talexframe/frame/core/modules/event/events/app/AppUnRegisteredEvent.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.talexframe.frame.core.modules.event.events.app;
22

33
import com.talexframe.frame.core.modules.application.TApp;
4-
import com.talexframe.frame.core.modules.event.TalexEvent;
4+
import com.talexframe.frame.core.modules.event.service.TalexEvent;
55
import com.talexframe.frame.core.modules.plugins.core.WebPlugin;
66
import lombok.Getter;
77

src/main/java/com/talexframe/frame/core/modules/event/events/dao/BaseDAOEvent.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.talexframe.frame.core.modules.event.events.dao;
22

3-
import com.talexframe.frame.core.modules.event.TalexEvent;
3+
import com.talexframe.frame.core.modules.event.service.TalexEvent;
44
import lombok.AllArgsConstructor;
55
import lombok.Getter;
66

0 commit comments

Comments
 (0)