`
iamzhongyong
  • 浏览: 805285 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

    博客分类:
  • java
阅读更多

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

 

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

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

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics