这个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
事件驱动架构的包含哪些组件?
在官方的解释上加了一些自己的理解