mirror of https://gitee.com/stylefeng/roses
【8.0】【event】完善事件发布过程
parent
64643fa1d8
commit
e5227ab533
|
@ -42,9 +42,4 @@ public @interface BusinessListener {
|
|||
*/
|
||||
String businessCode() default "";
|
||||
|
||||
/**
|
||||
* 业务数据的参数类型
|
||||
*/
|
||||
Class<?> clazz();
|
||||
|
||||
}
|
||||
|
|
|
@ -24,7 +24,9 @@
|
|||
*/
|
||||
package cn.stylefeng.roses.kernel.event.sdk;
|
||||
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.stylefeng.roses.kernel.event.api.annotation.BusinessListener;
|
||||
import cn.stylefeng.roses.kernel.event.sdk.container.EventContainer;
|
||||
import cn.stylefeng.roses.kernel.event.sdk.pojo.BusinessListenerDetail;
|
||||
import cn.stylefeng.roses.kernel.rule.util.AopTargetUtils;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
@ -33,6 +35,7 @@ import org.springframework.beans.factory.config.BeanPostProcessor;
|
|||
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 扫描所有的业务监听事件,最终汇总到Event容器中
|
||||
|
@ -73,21 +76,14 @@ public class EventAnnotationScanner implements BeanPostProcessor {
|
|||
* @since 2023/7/14 15:24
|
||||
*/
|
||||
private void doScan(Class<?> clazz, String beanName) {
|
||||
|
||||
ArrayList<BusinessListenerDetail> businessListenerDetails = new ArrayList<>();
|
||||
|
||||
Method[] declaredMethods = clazz.getDeclaredMethods();
|
||||
for (Method declaredMethod : declaredMethods) {
|
||||
BusinessListener businessListener = declaredMethod.getAnnotation(BusinessListener.class);
|
||||
|
||||
log.debug("扫描到业务事件监听: " + businessListener);
|
||||
|
||||
if (businessListener != null) {
|
||||
BusinessListenerDetail businessListenerDetail = createDefinition(beanName, declaredMethod, businessListener);
|
||||
|
||||
if (businessListenerDetail != null) {
|
||||
businessListenerDetails.add(businessListenerDetail);
|
||||
}
|
||||
|
||||
log.debug("扫描到资源: " + businessListenerDetail);
|
||||
createEventDetail(beanName, declaredMethod, businessListener);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -98,10 +94,35 @@ public class EventAnnotationScanner implements BeanPostProcessor {
|
|||
* @author fengshuonan
|
||||
* @since 2023/7/14 15:27
|
||||
*/
|
||||
private BusinessListenerDetail createDefinition(String beanName, Method method, BusinessListener businessListener) {
|
||||
private void createEventDetail(String beanName, Method method, BusinessListener businessListener) {
|
||||
|
||||
// 获取注解上的业务编码标识
|
||||
String businessCode = businessListener.businessCode();
|
||||
|
||||
// 从容器中获取本业务标识是否创建
|
||||
List<BusinessListenerDetail> listener = EventContainer.getListener(businessCode);
|
||||
if (ObjectUtil.isEmpty(listener)) {
|
||||
listener = new ArrayList<>();
|
||||
}
|
||||
|
||||
|
||||
return new BusinessListenerDetail();
|
||||
// 创建当前方法的调用信息
|
||||
BusinessListenerDetail businessListenerDetail = new BusinessListenerDetail();
|
||||
businessListenerDetail.setBeanName(beanName);
|
||||
businessListenerDetail.setListenerMethod(method);
|
||||
|
||||
// 获取方法参数信息
|
||||
int parameterCount = method.getParameterCount();
|
||||
if (parameterCount == 0) {
|
||||
businessListenerDetail.setParameterClassType(null);
|
||||
} else {
|
||||
businessListenerDetail.setParameterClassType(method.getParameterTypes()[0]);
|
||||
}
|
||||
|
||||
listener.add(businessListenerDetail);
|
||||
|
||||
// 放到事件容器中
|
||||
EventContainer.addListenerList(businessCode, listener);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -23,4 +23,11 @@ public class BusinessListenerDetail {
|
|||
*/
|
||||
private Method listenerMethod;
|
||||
|
||||
/**
|
||||
* 方法参数的类型,如果方法有多个参数,这里只获取第一个参数的类型
|
||||
* <p>
|
||||
* 如果方法没参数,则这里为null
|
||||
*/
|
||||
private Class<?> parameterClassType;
|
||||
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package cn.stylefeng.roses.kernel.event.sdk.publish;
|
||||
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.extra.spring.SpringUtil;
|
||||
import cn.stylefeng.roses.kernel.event.sdk.container.EventContainer;
|
||||
import cn.stylefeng.roses.kernel.event.sdk.pojo.BusinessListenerDetail;
|
||||
|
@ -8,35 +9,68 @@ import java.lang.reflect.InvocationTargetException;
|
|||
import java.lang.reflect.Method;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 业务事件发布工具
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @since 2023/7/14 16:21
|
||||
*/
|
||||
public class BusinessEventPublisher {
|
||||
|
||||
/**
|
||||
* 发布一个业务事件
|
||||
* <p>
|
||||
* 如果有方法上加了@BusinessListener,则会自动回调那些方法
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @since 2023/7/14 15:37
|
||||
*/
|
||||
public static <T> void publishEvent(String businessCode, T businessObject) {
|
||||
|
||||
// 获取该业务是否有监听器
|
||||
List<BusinessListenerDetail> listener = EventContainer.getListener(businessCode);
|
||||
|
||||
for (BusinessListenerDetail businessListenerDetail : listener) {
|
||||
|
||||
String beanName = businessListenerDetail.getBeanName();
|
||||
|
||||
Method listenerMethod = businessListenerDetail.getListenerMethod();
|
||||
|
||||
Object bean = SpringUtil.getBean(beanName);
|
||||
|
||||
try {
|
||||
listenerMethod.invoke(bean, businessObject);
|
||||
} catch (IllegalAccessException | InvocationTargetException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
// 没有监听器则直接返回
|
||||
if (ObjectUtil.isEmpty(listener)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 依次调用监听器方法,进行回调调用
|
||||
for (BusinessListenerDetail businessListenerDetail : listener) {
|
||||
|
||||
// 监听器的Spring Bean
|
||||
String beanName = businessListenerDetail.getBeanName();
|
||||
Object bean = SpringUtil.getBean(beanName);
|
||||
|
||||
// 监听器的具体方法
|
||||
Method listenerMethod = businessListenerDetail.getListenerMethod();
|
||||
Class<?> parameterClassType = businessListenerDetail.getParameterClassType();
|
||||
|
||||
// 如果发布事件的时候参数是空的,则直接调用无参的方法
|
||||
if (ObjectUtil.isEmpty(businessObject)) {
|
||||
|
||||
// 如果方法的参数数量为0,则直接调用,如果不为0,则跳过执行下个
|
||||
if (parameterClassType == null) {
|
||||
try {
|
||||
listenerMethod.invoke(businessObject);
|
||||
} catch (IllegalAccessException | InvocationTargetException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// 如果发布事件的时候,包含参数,则判断method的第一个参数是否和businessObject的class一样,不一样则不调用
|
||||
else {
|
||||
if (parameterClassType != null && parameterClassType.equals(businessObject.getClass())) {
|
||||
try {
|
||||
listenerMethod.invoke(bean, businessObject);
|
||||
} catch (IllegalAccessException | InvocationTargetException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -24,6 +24,8 @@
|
|||
*/
|
||||
package cn.stylefeng.roses.kernel.event.starter;
|
||||
|
||||
import cn.stylefeng.roses.kernel.event.sdk.EventAnnotationScanner;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
/**
|
||||
|
@ -35,4 +37,15 @@ import org.springframework.context.annotation.Configuration;
|
|||
@Configuration
|
||||
public class EventAutoConfiguration {
|
||||
|
||||
/**
|
||||
* 创建事件的扫描
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @since 2023/7/14 16:00
|
||||
*/
|
||||
@Bean
|
||||
public EventAnnotationScanner eventAnnotationScanner() {
|
||||
return new EventAnnotationScanner();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue