使用guava中的EventBus构建内存级别的事件引擎

这个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 

 

事件驱动架构的包含哪些组件?

在官方的解释上加了一些自己的理解

使用guava中的EventBus构建内存级别的事件引擎_第1张图片

 

你可能感兴趣的:(事件驱动)