perf[event]: the event method name is changeless

This commit is contained in:
godotg committed 2024-03-23 17:43:21 +08:00
1 parent 9932e046b6
commit 92b8ee0680
11 files changed
+21 -128

No files matched your search

@@ -1,13 +0,0 @@
package com.zfoo.event;
import java.lang.reflect.Method;
/**
* 订阅者抛出异常上下文
*
* @param event 事件对象
* @param subscriber 订阅者
* @param subscriberMethod 订阅方法
*/
public record EventExceptionContext(Object event, Object subscriber, Method subscriberMethod) {
}
@@ -1,48 +0,0 @@
package com.zfoo.event;
import com.zfoo.event.manager.EventBus;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.reflect.Method;
/**
* 处理事件订阅者抛出异常
*
* @author veione
*/
@FunctionalInterface
public interface EventExceptionHandler {
/**
* 处理订阅者抛出的异常
*
* @param exception 异常对象
* @param context 异常上下文
*/
void handleException(Throwable exception, EventExceptionContext context);
final class LoggingEventExceptionHandler implements EventExceptionHandler {
public static final LoggingEventExceptionHandler INSTANCE = new LoggingEventExceptionHandler();
private final Logger logger = LoggerFactory.getLogger(EventBus.class.getName());
@Override
public void handleException(Throwable exception, EventExceptionContext context) {
if (logger.isErrorEnabled()) {
logger.error(message(context), exception);
}
}
private static String message(EventExceptionContext context) {
Method method = context.subscriberMethod();
return "Exception thrown by subscriber method "
+ method.getName()
+ '('
+ method.getParameterTypes()[0].getName()
+ ')'
+ " on subscriber "
+ context.subscriber()
+ " when dispatching event: "
+ context.event();
}
}
}
@@ -1,19 +0,0 @@
package com.zfoo.event.anno;
import org.springframework.aot.hint.annotation.Reflective;
import org.springframework.stereotype.Service;
import java.lang.annotation.*;
/**
* 用于标记处理事件接口
*
* @author veione
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Reflective
@Service
public @interface EventService {
}
@@ -63,17 +63,11 @@ public abstract class EnhanceUtils {
field.setModifiers(Modifier.PRIVATE + Modifier.FINAL);
enhanceClazz.addField(field);
// 定义类中的一个成员method
CtClass methodClass = classPool.get(method.getClass().getName());
CtField methodField = new CtField(methodClass, "method", enhanceClazz);
methodField.setModifiers(Modifier.PRIVATE + Modifier.FINAL);
enhanceClazz.addField(methodField);
// 定义类的构造器
// 创建构造函数参数数组
CtClass[] parameterTypes = {beanClass, methodClass};
CtClass[] parameterTypes = {beanClass};
CtConstructor constructor = new CtConstructor(parameterTypes, enhanceClazz);
constructor.setBody("{this.bean=$1; this.method=$2;}");
constructor.setBody("{this.bean=$1;}");
constructor.setModifiers(Modifier.PUBLIC);
enhanceClazz.addConstructor(constructor);
@@ -98,18 +92,11 @@ public abstract class EnhanceUtils {
beanMethod.setBody(beanMethodBody);
enhanceClazz.addMethod(beanMethod);
// 定义类实现的接口方法getMethod
CtMethod getMethod = new CtMethod(classPool.get(Method.class.getName()), "getMethod", null, enhanceClazz);
getMethod.setModifiers(Modifier.PUBLIC + Modifier.FINAL);
String getMethodBody = "{ return this.method; }";
getMethod.setBody(getMethodBody);
enhanceClazz.addMethod(getMethod);
// 释放缓存
enhanceClazz.detach();
Class<?> resultClazz = enhanceClazz.toClass(IEventReceiver.class);
Constructor<?> resultConstructor = resultClazz.getConstructor(bean.getClass(), method.getClass());
return (IEventReceiver) resultConstructor.newInstance(bean, method);
Constructor<?> resultConstructor = resultClazz.getConstructor(bean.getClass());
return (IEventReceiver) resultConstructor.newInstance(bean);
}
}
@@ -26,6 +26,4 @@ public interface IEventReceiver {
void invoke(IEvent event);
Object getBean();
Method getMethod();
}
@@ -12,8 +12,6 @@
*/
package com.zfoo.event.manager;
import com.zfoo.event.EventExceptionContext;
import com.zfoo.event.EventExceptionHandler;
import com.zfoo.event.enhance.IEventReceiver;
import com.zfoo.event.model.IEvent;
import com.zfoo.protocol.collection.CollectionUtils;
@@ -35,6 +33,8 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
/**
* @author godotg
@@ -59,7 +59,8 @@ public abstract class EventBus {
/**
* event exception handler
*/
private static EventExceptionHandler exceptionHandler = EventExceptionHandler.LoggingEventExceptionHandler.INSTANCE;
public static BiConsumer<IEventReceiver, IEvent> exceptionHandler = null;
public static Consumer<IEvent> noEventReceiverHandler = null;
static {
for (int i = 0; i < executors.length; i++) {
@@ -93,15 +94,6 @@ public abstract class EventBus {
}
}
/**
* 设置异常处理器
*
* @param handler 异常处理器
*/
public static void setExceptionHandler(EventExceptionHandler handler) {
exceptionHandler = handler;
}
/**
* Publish the event
*
@@ -114,7 +106,9 @@ public abstract class EventBus {
var clazz = event.getClass();
var receivers = receiverMap.get(clazz);
if (CollectionUtils.isEmpty(receivers)) {
logger.warn("This event [" + clazz.getName() + "] has not registered any valid event handler");
if (noEventReceiverHandler != null) {
noEventReceiverHandler.accept(event);
}
return;
}
for (var receiver : receivers) {
@@ -130,7 +124,10 @@ public abstract class EventBus {
try {
receiver.invoke(event);
} catch (Throwable t) {
exceptionHandler.handleException(t.getCause(), new EventExceptionContext(event, receiver.getBean(), receiver.getMethod()));
logger.error("eventBus {} [{}] unknown error", receiver.bus(), event.getClass().getSimpleName(), t);
if (exceptionHandler != null) {
exceptionHandler.accept(receiver, event);
}
}
}
@@ -32,8 +32,6 @@ public class ApplicationTest {
// see receiver method of MyController1 and MyController2
EventBus.post(MyNoticeEvent.valueOf("我的事件"));
EventBus.post(new UnhandledEvent());
ThreadUtils.sleep(1000);
}
@@ -14,14 +14,14 @@
package com.zfoo.event;
import com.zfoo.event.anno.EventReceiver;
import com.zfoo.event.anno.EventService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
/**
* @author godotg
*/
@EventService
@Component
public class MyController1 {
private static final Logger logger = LoggerFactory.getLogger(MyController1.class);
@@ -30,7 +30,6 @@ public class MyController1 {
@EventReceiver
public void onMyNoticeEvent(MyNoticeEvent event) {
logger.info("方法1同步执行事件:" + event.getMessage());
throw new NullPointerException();
}
}
@@ -15,14 +15,14 @@ package com.zfoo.event;
import com.zfoo.event.anno.Bus;
import com.zfoo.event.anno.EventReceiver;
import com.zfoo.event.anno.EventService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
/**
* @author godotg
*/
@EventService
@Component
public class MyController2 {
private static final Logger logger = LoggerFactory.getLogger(MyController2.class);
@@ -15,14 +15,14 @@ package com.zfoo.event;
import com.zfoo.event.anno.Bus;
import com.zfoo.event.anno.EventReceiver;
import com.zfoo.event.anno.EventService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
/**
* @author godotg
*/
@EventService
@Component
public class MyController3 {
private static final Logger logger = LoggerFactory.getLogger(MyController3.class);
@@ -1,6 +0,0 @@
package com.zfoo.event;
import com.zfoo.event.model.IEvent;
public class UnhandledEvent implements IEvent {
}