package org.example.platform.esb;
import org.example.platform.esb.base.BaseEvent;
import org.example.platform.esb.itf.IListener;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class ESB {
private static Map<String, List<IListener>> listeners=new LinkedHashMap<>();
public static void doEvent(BaseEvent e) {
String eventType = e.getClass().getName();
Method beforeMethod = findMethod(e, "before");
if(beforeMethod!=null){
try {
beforeMethod.invoke(e.getSender(),e);
} catch (Exception err) {
throw new RuntimeException(err);
}
}
if(listeners.containsKey(eventType)){
for (IListener iListener : listeners.get(eventType)) {
iListener.doEvent(e);
}
}
Method afterMethod = findMethod(e, "after");
if(afterMethod!=null){
try {
afterMethod.invoke(e.getSender(),e);
} catch (Exception err) {
throw new RuntimeException(err);
}
}
}
private static Method findMethod(BaseEvent e, String prefix) {
if(e.getSender()!=null){
Object sender = e.getSender();
for (Method method : sender.getClass().getMethods()) {
if((prefix + e.getClass().getSimpleName()).equals(method.getName())&&
method.getParameterCount()==1 &&
method.getParameterTypes()[0].getName().equals(e.getClass().getName())
){
return method;
}
}
}
return null;
}
public synchronized static void reg(IListener ... listenerArray) {
for (IListener iListener : listenerArray) {
Class type = (Class)((ParameterizedType)iListener.getClass().getGenericInterfaces()[0]).getActualTypeArguments()[0];
if(!listeners.containsKey(type.getName())){
listeners.put(type.getName(),new ArrayList<IListener>());
}
if(!listeners.get(type.getName()).contains(iListener)){
listeners.get(type.getName()).add(iListener);
}
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
本代码实现了一个简单的EventBus结构。 当一个组织中的人数众多,我们需要将关注点拆分,以避免陷入逻辑混乱和不必要的代码冲突,而且能带来一些可以让组件复用的好处。 但是如果将一个复杂的问题解耦成若干个小问题之后,如何让它们有机的协作在一起便成为了一个难题。大多数情况,系统内的各个组件是串联在一起,形成管道过滤器风格的架构,即上一个组件的输出是下一个组件的输入。但这种风格下又会导致上游组件并不能快速对下游组件的结果做出反馈,所以通常情况下可以采用AOP切面、函数式回调、委托对象、或者利用传址引用的特性来构建统一上下文的方式来解决。 所以EventBus的实现目标是: 1、让代码能够串行执行,在执行过程中还可以派生新的事件。 2、根据事件传播模型,如果发生异常断言则停止事件传播。 3、能够对组件串行执行的先后顺序进行编排。 4、有共性的处理机制可以进行封装,执行过程中视其为透明。 5、通过隐藏一些实现细节,使每一个关注点看起来都非常易于修改,提高效率。
资源推荐
资源详情
资源评论
收起资源包目录
project.zip (23个子文件)
pom.xml 3KB
src
test
java
org
example
AppTest.java 303B
main
java
org
example
platform
Platform.java 1KB
esb
itf
IListener.java 174B
base
BaseEvent.java 220B
ESB.java 2KB
context
ContextFactory.java 663B
entity
BaseContext.java 79B
ApplicationContext.java 136B
SessionContext.java 213B
base
BaseEntity.java 282B
events
CreateEvent.java 482B
ModifyEvent.java 482B
listener
create
ValidateByCreate.java 618B
GenAuditInfoByCreate.java 836B
InsertByCreate.java 650B
GenPkByCreate.java 477B
modify
ValidateByModify.java 618B
GenAuditInfoByModify.java 726B
UpdateByModify.java 650B
Test.java 1KB
domain
student
StudentService.java 1KB
Student.java 239B
共 23 条
- 1
资源评论
杨若瑜
- 粉丝: 1839
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功