Google EventBus入门

简介

Guava在guava-libraries中为我们提供了事件总线EventBus库,它是事件发布订阅模式的实现,让我们能在领域驱动设计(DDD)中以事件的弱引用本质对我们的模块和领域边界很好的解耦设计。
首先Guava为我们提供了同步事件EventBus和异步实现AsyncEventBus两个事件总线,他们都不是单例的,官方理由是并不想我们我们的使用方式。当然如果我们想其为单例,我们可以很容易封装它,一个单例模式保证只创建一个实例就对了。

maven依赖

<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->

        <dependency>

            <groupId>com.google.guava</groupId>

            <artifactId>guava</artifactId>

            <version>19.0</version>

        </dependency>

内部方法

	//注册
    public void register(Object object) {
        this.subscribers.register(object);
    }
	//反注册
    public void unregister(Object object) {
        this.subscribers.unregister(object);
    }
	//发布订阅
    public void post(Object event) {
        Iterator<Subscriber> eventSubscribers = this.subscribers.getSubscribers(event);
        if (eventSubscribers.hasNext()) {
            this.dispatcher.dispatch(event, eventSubscribers);
        } else if (!(event instanceof DeadEvent)) {
            this.post(new DeadEvent(this, event));
        }

    }
   

注册

这里通过Spring的@PostConstruct注解进行注册
调用了EventBus的方法:register

    @PostConstruct
 private void init(){
     eventBus = new AsyncEventBus(Executors.newFixedThreadPool(4));
     eventBus.register(listerService);
 }
 ```
### 订阅
EventBus的订阅很简单只需要一个注解@Subscribe+一个有一个入参的方法即可
一个订阅者的demo:
```java
 @Subscribe
 public void lister(Integer integer){
     System.out.println(integer);
     log.info("lister has receive a message :{}",integer);
 }

Guava发布的事件默认不会处理线程安全的,但我们可以标注@AllowConcurrentEvents来保证其线程安全

发布

对于事件源,则可以通过post方法发布事件。 正在这里对于Guava对于事件的发布,是依据上例中订阅方法的方法参数类型决定的,换而言之就是post传入的类型和其基类类型可以收到此事件。例如下例

 public void doEventBus(Integer integer){
     log.info("doEventBus --> {}",integer);
     eventBus.post(integer);
 }

执行结果

调用doEventBus 通过post方法匹配入参Integer类型
订阅者ListerService收到消息开始执行方法:
在这里插入图片描述

Demo源码:
https://github.com/sihgyu/EventBusDemo

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值