前言
EventBus是一种基于注解和反射的Publisher/Subscriber(发布/订阅者)事件总线
原理分析
发布者通过EventBus发布事件,订阅者通过EventBus订阅事件。当发布者发布事件时,订阅该事件的订阅者的事件处理方法将被调用
如上图:
Publisher(消费者)通过调用EventBus的post()方法抛出事件,EventBus基于事件通过发射找到相应的处理器(订阅者)执行
1,EventBus的角色,在此处eventBus主要起到线程之间传递数据的作用,其中有一个方法register(),会对传入的对象进行处理,将含有@Subscriber注解的将方法存入到一个map集合中,而这个map最终可以看成是:消息处理总线
2,每一个含有@Subscriber注解的方法相当于一个handler,通过方法的形参,区分不同的handler被调用
3,Publisher(发布者)通过调用post()方法,根据传入的实参,通过反射的方式找到相应的处理器并进行调
关于
基本使用:
第一步:添加maven依赖
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>19.0</version>
</dependency>
第二步:定义消息总线,调用register()初始化EventBus和Handler
--通过<bean>的方式,将消息总线交给spring-ioc容器进行管理
@Service
public class SyncDataTask {
private EventBus eventBus;
private static SyncDataTask instance;
public static SyncDataTask getInstance() {
return instance;
}
public SyncDataTask(List<Object> listeners) {
eventBus = new AsyncEventBus(Executors.newFixedThreadPool(5));
for (int i = 0; i < listeners.size(); i++) {
this.eventBus.register(listeners.get(i));
}
SyncDataTask.instance = this;
}
/**
* 发布事件
*
* @param event
*/
public void publishEvent(Object event) {
this.eventBus.post(event);
}
}
<bean id="syncDataTask" class="com.fitc.soldier.cph.common.task.event.SyncDataTask">
<constructor-arg index="0">
<list>
<ref bean="studentGraduateTaskImpl"/>
<ref bean="studentScoreTaskImpl"/>
</list>
</constructor-arg>
</bean>
第三步:定义事件处理类,定义方法(处理器handler)
@Service
public class StudentScoreTaskImpl {
@Resource(name = "apiStudentServiceImpl")
private IStudentService studentService;
@Subscribe
public void doAddStudentWork(StudentScoreData data) {
try {
studentService.addStudentScore(data);
} catch (FitcRPCException e) {
e.printStackTrace();
}
}
}
第四步:调用post()方法抛出事件
@Override
public Boolean batchAddStudentScore(List<StudentScoreData> data) throws FitcRPCException {
for (int i = 0; i < data.size(); i++) {
SyncDataTask.getInstance().publishEvent(data.get(i));
}
return true;
}
参考: