这个EventBus是guava中比较给力的一个类,从字面上看是事件总线,解决了传统的观察这模式的问题,使用比较灵活方便。最近打算搞一个轻量级的事件驱动引擎,重点参照了这个类EventBus,如果是内存级别的事件分发或者MQ,推荐直接用EventBus。
关于EventBus中的几个问题?
1、 事件定义:任意的对象即可;
2、 事件处理器的注册:事件处理的方法,添加注解即可,然后事件处理器的对象注册到总线中,总线维护一个事件和事件处理器的关联关系,在内存中;
3、 事件的处理过程:同步处理和异步处理,事件提交之后,事件队列维护在本地缓存,同步的方式直接当前线程去执行,异步的处理策略是在初始化事件总线的时候就搞了一个线程池出来,由线程池去异步执行;
4、 EventBus就开放了三个方法,register/post/unregister
5、 为什么会有unregister?
在99.99%的使用场景中,是不会在runtime的时候去register/unregister某个observer的,在spring的环境,也是在init的时候做register/unregister。不过做framework就必须要考虑这0.01%的使用场景。
一个简单的例子:
1、一个事件的定义(任何对象都可以是事件)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
public class SignEvent {
private String companyName;
private String signName;
private Date signDate;
public SignEvent(String name,String signName, Date signDate) {
super ();
this .companyName = name;
this .signName = signName;
this .signDate = signDate;
}
public String getMessage(){
StringBuilder sb = new StringBuilder();
sb.append( "物流公司:" ).append( this .companyName);
sb.append( "签收人:" ).append(signName).append( ",签收日期:" ).append(signDate);
return sb.toString();
}
} |
2、定义两个事件监听器,添加注解做事件的订阅
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public class YTOEventListener {
@Subscribe
public void consign(SignEvent signEvent){
if (signEvent.getCompanyName().equalsIgnoreCase( "YTO" )){
System.out.println( "YTO。。。开始发货" );
System.out.println(signEvent.getMessage());
}
}
@Subscribe
public void delivery(SignEvent signEvent){
if (signEvent.getCompanyName().equalsIgnoreCase( "YTO" )){
System.out.println( "YTO。。。开始投递" );
}
}
} |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public class SFEventListener {
@Subscribe
public void consign(SignEvent signEvent){
if (signEvent.getCompanyName().equalsIgnoreCase( "SF" )){
System.out.println( "SF。。。开始发货" );
System.out.println(signEvent.getMessage());
}
}
@Subscribe
public void delivery(SignEvent signEvent){
if (signEvent.getCompanyName().equalsIgnoreCase( "SF" )){
System.out.println( "SF。。。开始投递" );
}
}
} |
3、EventBus的例子,包含时间的注册以及事件的提交
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
public class EventBusTest {
public static void siginalThreadConsumer(){
EventBus bus = new EventBus( "iamzhongyong" );
SFEventListener sf = new SFEventListener();
YTOEventListener yto = new YTOEventListener();
bus.register(sf);
bus.register(yto);
SignEvent sign1 = new SignEvent( "SF" , "比熊啊" , new Date());
bus.post(sign1);
SignEvent sign2 = new SignEvent( "YTO" , "你妹的" , new Date());
bus.post(sign2);
}
public static void multiThread(){
EventBus bus = new AsyncEventBus(Executors.newFixedThreadPool( 3 ));
SFEventListener sf = new SFEventListener();
YTOEventListener yto = new YTOEventListener();
bus.register(sf);
bus.register(yto);
SignEvent sign1 = new SignEvent( "SF" , "比熊啊" , new Date());
bus.post(sign1);
SignEvent sign2 = new SignEvent( "YTO" , "你妹的" , new Date());
bus.post(sign2);
}
public static void main(String[] args) {
EventBusTest.siginalThreadConsumer();
EventBusTest.multiThread();
}
} |
事件驱动架构的官方解释是啥?
这里看了一下官方wiki的介绍,http://en.wikipedia.org/wiki/Event-driven_architecture
事件驱动架构的包含哪些组件?
在官方的解释上加了一些自己的理解
相关推荐
jar包,亲测可用
EventBus 是一个基于事件的一个发布/订阅框架,通过解耦发布者和订阅者简化事件传递,这里的事件可以理解为消息,本文中统一称为事件也就是 Event。通过EventBus可以简化生产者/消费者 这种模型,同时又可以通过...
jar包,亲测可用
jar包,亲测可用
jar包,亲测可用
jar包,亲测可用
jar包,亲测可用
jar包,亲测可用
jar包,亲测可用
jar包,亲测可用
jar包,亲测可用
在本文中,我们将深入探讨如何在SpringBoot应用中使用EventBus,这是一个基于Guava库的事件总线系统。EventBus的引入使得松耦合的组件间通信变得更加简单和高效。让我们一起通过步骤来理解这个“SpringBoot+EventBus...
jar包,亲测可用
jar包,亲测可用
jar包,亲测可用
jar包,亲测可用
jar包,亲测可用
jar包,亲测可用
jar包,亲测可用
jar包,亲测可用