首先EventUtils工具类:
package com.example.core.event.utils;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.CollectionUtils;
import com.example.core.context.SpringContext;
import com.example.core.event.IEvent;
import com.example.core.exception.BusinessException;
/**
* ClassName:EventUtils
* Function: 事件分发器.
* Reason: 根据基础事件接口,可以在context中查找所有的事件实现进行处理.
* Date: 2020年6月30日 上午12:11:10
*
* @author demorookie
* @version 1.0.0
*/
public final class EventUtils {
private static final Logger logger = LoggerFactory.getLogger(EventUtils.class);
/**
*
* dispatcher:(事件分发器).
* 定义事件执行流程.
*
* @author demorookie
* @param eventClass
* @param objects
*/
public static <Event extends IEvent> void dispatcher(
Class<Event> eventClass, Object... objects) {
logger.info("dispatch event for " + eventClass);
try {
Map<String, Event> eventBeanMap = SpringContext.getContext()
.getBeansOfType(eventClass);
if (!CollectionUtils.isEmpty(eventBeanMap)) {
Collection<Event> eventCollection = eventBeanMap.values();
// 对事件实现列表进行排序处理
List<Event> events = new ArrayList<Event>();
events.addAll(eventCollection);
Collections.sort(events, new Comparator<Event>() {
@Override
public int compare(Event o1, Event o2) {
return o1.order() - o2.order();
}
});
for (Event event : events) {
logger.debug("current dispatcher event:" + event);
event.execute(objects);
}
}
} catch (Exception e) {
logger.warn("can't find the event impl for " + eventClass);
logger.error("publish event fail.", e);
throw new BusinessException("publish event fail.", e);
}
logger.info("dispatch event end.");
}
/**
*
* dispatcherAsync:(分发异步任务).
* 事件分发器,异步形式执行.
*
* @author demorookie
* @param eventClass
* @param objects
*/
public static <Event extends IEvent> void dispatcherAsync(
final Class<Event> eventClass, final Object... objects) {
new Thread(new Runnable() {
@Override
public void run() {
logger.info("dispatcherAsync start......");
EventUtils.dispatcher(eventClass, objects);
logger.info("dispatcherAsync end......");
}
}).start();
}
}
公共事件接口:IEvent.java
package com.example.core.event;
/**
* ClassName:IEvent
* Function: 公共事件模型基础对象.
* Reason: 基于Spring的对象查找机制,对注册的事件进行查找处理.
* Date: 2020年6月30日 上午12:11:10
*
* @author demorookie
* @version 1.0.0
*/
public interface IEvent {
/**
*
* order:(事件排序号).
* (事件分发器可以根据事件排序号进行排序后处理).
* (针对有些事件有处理顺序的可以按照排序号进行注册).
*
* @author demorookie
* @return 返回排序号
*/
int order();
/**
*
* execute:(事件执行器).
* (执行事件内容的操作).
* (参数触发条件为事件实现自定义处理,任意参数且参数非必须).
*
* @author demorookie
* @param objects
* ----可以设定被执行的对象,次对象可以在初始化的时候被调用触发
*/
void execute(Object... objects);
}
获取spring上下文:SpringContext.java
/**
* Project Name:com.example.core
* File Name:SpringContext.java
* Package Name:com.example.core.context
* Date:2020年6月30日 上午12:11:10
*
*/
package com.example.core.context;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
/**
* ClassName:SpringContext <br/>
* Function: 获取spring上下文. <br/>
* Reason: 获取spring上下文. <br/>
* Date: 2020年6月30日 上午12:11:10
*
* @author demorookie
* @version 1.0.0
*/
public final class SpringContext {
private static final Logger logger = LoggerFactory.getLogger(SpringContext.class);
private static ApplicationContext applicationContext = null;
public static void setApplicationContext(ApplicationContext context) throws BeansException {
if (null == SpringContext.applicationContext) {
SpringContext.applicationContext = context;
}
logger.info("=======ApplicationContext配置成功==========");
}
/**
*
* getApplicationContext:(获取applicationContext).
*
* @author demorookie
* @return
*/
public static ApplicationContext getContext() {
return applicationContext;
}
/**
*
* getBean:(通过name获取 Bean).
*
* @author demorookie
* @param name
* @return
*/
public static Object getBean(String name) {
return getContext().getBean(name);
}
/**
*
* getBean:(通过class获取Bean).
*
* @author demorookie
* @param clazz
* @return
*/
public static <T> T getBean(Class<T> clazz) {
return getContext().getBean(clazz);
}
/**
*
* getBean:(通过name,以及Clazz返回指定的Bean).
*
* @author demorookie
* @param name
* @param clazz
* @return
*/
public static <T> T getBean(String name, Class<T> clazz) {
return getContext().getBean(name, clazz);
}
}