mirror of
https://github.com/tiennm99/zfoo.git
synced 2026-10-14 02:16:31 +00:00
perf[event]: the event method name is changeless
This commit is contained in:
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 {
|
||||
}
|
||||
Reference in new issue
Block a user