Skip to content

Commit 8abfe11

Browse files
committed
Added ability to post events to multiple Handler Objects;
1 parent b586ff6 commit 8abfe11

File tree

5 files changed

+71
-14
lines changed

5 files changed

+71
-14
lines changed

src/main/java/net/lamgc/utils/event/EventExecutor.java

Lines changed: 46 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.lang.reflect.InvocationTargetException;
44
import java.lang.reflect.Method;
5+
import java.lang.reflect.Modifier;
56
import java.util.List;
67
import java.util.Set;
78
import java.util.concurrent.ThreadFactory;
@@ -42,11 +43,13 @@ public EventExecutor(ThreadPoolExecutor threadPoolExecutor,
4243
final ThreadFactory threadFactory = this.threadPoolExecutor.getThreadFactory();
4344
this.threadPoolExecutor.setThreadFactory(r -> {
4445
Thread newThread = threadFactory.newThread(r);
45-
newThread.setUncaughtExceptionHandler((t, e) -> {
46-
if(this.exceptionHandler != null){
47-
this.exceptionHandler.uncaughtException(t, e);
48-
}
49-
});
46+
if(newThread.getUncaughtExceptionHandler() == newThread.getThreadGroup()){
47+
newThread.setUncaughtExceptionHandler((t, e) -> {
48+
if(this.exceptionHandler != null){
49+
this.exceptionHandler.uncaughtException(t, e);
50+
}
51+
});
52+
}
5053
return newThread;
5154
});
5255
this.eventHandlerList = eventHandlerList != null ? eventHandlerList : new BasicEventHandlerList();
@@ -84,7 +87,41 @@ public void executor(final EventObject eventObject){
8487
return;
8588
}
8689
eventHandlerMethod.forEach(method -> {
87-
EventHandler handler = eventHandlerObjectMap.getHandlerObject(method.getDeclaringClass());
90+
final Set<EventHandler> handlerSet = eventHandlerObjectMap.getHandlerObject(method.getDeclaringClass());
91+
threadPoolExecutor.execute(() -> handlerSet.forEach(handler -> {
92+
try {
93+
method.invoke(handler, eventObject);
94+
} catch (IllegalAccessException e) {
95+
throw new RuntimeException(e);
96+
} catch (InvocationTargetException e){
97+
throw new RuntimeException(e.getCause() == null ? e : e.getCause());
98+
}
99+
}));
100+
});
101+
}
102+
103+
/**
104+
* 对指定{@link EventHandler}投递事件
105+
* @param handler 要进行事件投递的EventHandler
106+
* @param eventObject 事件对象
107+
* @return 返回已处理事件方法数量
108+
*/
109+
public int executor(EventHandler handler, EventObject eventObject){
110+
Method[] methods = handler.getClass().getDeclaredMethods();
111+
int invokeCount = 0;
112+
for (Method method : methods) {
113+
int modifiers = method.getModifiers();
114+
if(!Modifier.isPublic(modifiers) || Modifier.isAbstract(modifiers) || Modifier.isInterface(modifiers)){
115+
continue;
116+
}
117+
Class<?>[] types = method.getParameterTypes();
118+
if(types.length != 1){
119+
continue;
120+
}
121+
if(!eventObject.getClass().isAssignableFrom(types[0])){
122+
continue;
123+
}
124+
88125
threadPoolExecutor.execute(() -> {
89126
try {
90127
method.invoke(handler, eventObject);
@@ -94,7 +131,9 @@ public void executor(final EventObject eventObject){
94131
throw new RuntimeException(e.getCause() == null ? e : e.getCause());
95132
}
96133
});
97-
});
134+
invokeCount++;
135+
}
136+
return invokeCount;
98137
}
99138

100139
/**

src/main/java/net/lamgc/utils/event/EventHandlerObjectMap.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package net.lamgc.utils.event;
22

3+
import java.util.Set;
4+
35
/**
46
* EventHandler对象存储Map.
57
* 用于对EventHandler对象进行存储而无需重新实例化.
@@ -17,7 +19,7 @@ public interface EventHandlerObjectMap {
1719
* @param eventHandlerClass EventHandler的Class对象
1820
* @return 如果找到则返回EventHandler对象, 无则返回null
1921
*/
20-
EventHandler getHandlerObject(Class<?> eventHandlerClass);
22+
Set<EventHandler> getHandlerObject(Class<?> eventHandlerClass);
2123

2224
/**
2325
* 删除指定的{@link EventHandler}

src/main/java/net/lamgc/utils/event/HashHandlerObjectMap.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,23 @@
11
package net.lamgc.utils.event;
22

33
import java.util.HashMap;
4+
import java.util.HashSet;
5+
import java.util.Set;
46

57
public class HashHandlerObjectMap implements EventHandlerObjectMap {
68

7-
private final HashMap<Class<? extends EventHandler>, EventHandler> handlerMap = new HashMap<>();
9+
private final HashMap<Class<? extends EventHandler>, HashSet<EventHandler>> handlerMap = new HashMap<>();
810

911
@Override
1012
public void addHandlerObject(EventHandler eventHandler) {
11-
handlerMap.put(eventHandler.getClass(), eventHandler);
13+
if(!handlerMap.containsKey(eventHandler.getClass())){
14+
handlerMap.put(eventHandler.getClass(), new HashSet<>());
15+
}
16+
handlerMap.get(eventHandler.getClass()).add(eventHandler);
1217
}
1318

1419
@Override
15-
public EventHandler getHandlerObject(Class<?> eventHandlerClass) {
20+
public Set<EventHandler> getHandlerObject(Class<?> eventHandlerClass) {
1621
return handlerMap.get(eventHandlerClass);
1722
}
1823

src/test/java/net/lamgc/utils/event/EventExecutorTest.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,15 @@ public void executorTest() throws IllegalAccessException, InterruptedException {
2424
}
2525
});
2626
EventExecutor executor = new EventExecutor(threadPoolExecutor);
27-
SimpleEventHandler handler = new SimpleEventHandler();
27+
SimpleEventHandler handler = new SimpleEventHandler("handler1");
28+
SimpleEventHandler handler2 = new SimpleEventHandler("handler2");
2829
executor.addHandler(handler);
30+
executor.addHandler(handler2);
2931
executor.executor(new SimpleEventObject(1, "HelloWorld"));
3032
Thread.sleep(500L);
33+
System.out.println("OnlyHandlerTest-----");
34+
executor.executor(handler2, new SimpleEventObject(1, "HelloWorld"));
35+
Thread.sleep(500L);
3136
executor.removeHandler(handler);
3237
System.out.println("deleted Handler");
3338
executor.executor(new SimpleEventObject(2, "HelloWorld123"));

src/test/java/net/lamgc/utils/event/SimpleEventHandler.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,14 @@
22

33
public class SimpleEventHandler implements EventHandler {
44

5-
public void simpleEventHandler1(SimpleEventObject event){
6-
System.out.println(this.getClass().getSimpleName() + " - [" + event.errorCode + "] " + event.msg);
5+
private String flag;
6+
7+
public SimpleEventHandler(String flag){
8+
this.flag = flag;
9+
}
10+
11+
public void simpleEventHandler(SimpleEventObject event){
12+
System.out.println(this.toString() + "." + flag + " - [" + event.errorCode + "] " + event.msg);
713
}
814

915
}

0 commit comments

Comments
 (0)