`
A牛哥哥
  • 浏览: 150183 次
社区版块
存档分类
最新评论

Guava事件总线EventBus和AsyncEventBus简介

阅读更多
摘自http://www.xiaoyaochong.net/wordpress/index.php/2013/11/17/google-guava-eventbus%E5%AE%9E%E4%BE%8B%E4%B8%8E%E5%88%86%E6%9E%90/

EventBus是Guava框架对观察者模式的一种实现,使用EventBus可以很简洁的实现事件注册监听和消费。Guava框架里面提供了两种相关的实现,一种是单线程同步事件消费,另外一直是多线程异步事件消费。后者在对象设计上是前者的子类。

首先我们看一个最简单的实例:
public class Event {
 
    @Subscribe
    public void sub(String message) {
        System.out.println(message);
    }
 
}


单元测试:

    @Test
    public void testEventBus() {
        EventBus eventBus = new EventBus();
        eventBus.register(new Event());//注册事件
        eventBus.post("ssdf");// 触发事件处理
    }



如上所示的短短10行代码,就可以实现一个稳定的观察者模式。简单分析一下源码,调用eventBus.register(new Event())的时候,eventBus实例会将时间对象放置在SetMultimap<Class<?>, EventHandler> handlersByType中,这是一个线程安全的对象容器,卸载事件也是在这个容器中做移除操作。关键代码是eventBus.post(“ssdf”),调用post的时候,eventBus实例会将参数匹配的对象分发到事件队列(ThreadLocal<Queue<EventWithHandler>> eventsToDispatch)中,当所有事件分发完毕之后,事件队列做统一的事件消费。以上所提及的容器,队列,都是线程安全,本地线程,单线程,同步的。
如果想实现一个多线程异步出的时间容器,怎么实现能,不用担心,Guava框架提供了AsyncEventBus。单元测试代码如下:

    @Test
    public void testAysncEventBus() {
        AsyncEventBus eventBus = new AsyncEventBus(Executors.newFixedThreadPool(3));
        eventBus.register(new Event());
        eventBus.post("ssdf");
        System.out.println("==");
    }



AsyncEventBus的实现中,事件注册,卸载,都是使用的相同的逻辑。不同的处理过程在于分发事件和消费事件。事件队列使用并发安全队列替代ThreadLocal,具体的队列容器是private final ConcurrentLinkedQueue<EventWithHandler> eventsToDispatch。消费事件任务则是一个线程池,一个Executor实现,这个实现由开发者自行定义提供。
关于DeadEvent的描述,本人看了网上的一些资料,描述的不清晰,下面用一种最简单的情景进行描述。

    @Test
    public void testDeadEven() {
        EventBus eventBus = new EventBus();
        eventBus.register(new Event());// Event对象的事件方法参数是String对象
        eventBus.post(123);// 使用int类型
    }



如上所示的代码,将产生一个DeadEvent,原因很简单,Event对象的@Subscribe方法是public void sub(String message) ,参数类型和post传递的参数不匹配,这将会造成Event的@Subscribe方法不被消费,这个时候,EventBus会将此Event封装成DeadEvent。
分享到:
评论

相关推荐

    基于Guava的事件总线Otto.zip

    Otto 是基于 Guava 的,增强的事件总线,强调 Android 支持。 Otto 是把应用分离成不同部分,但是仍然可以很好的进行通讯。Otto 是从 Guava forked 而来,但是添加了许多独特的功能,而且精炼了事件总线。下载:  ...

    EventBus与Spring Event区别详解(EventBus 事件机制,Spring Event事件机制)

    EventBus事件机制 EventBus是Google Guava项目的一部分,提供了一个轻量级的事件机制实现。它基于观察者模式(或发布订阅模式),主要分为三部分:发布者、监听者、事件。EventBus的使用非常简单,只需要定义事件...

    Guava-Event-Bus:Guava的EventBus源码学习

    EventBus 是一个基于事件的一个发布/订阅框架,通过解耦发布者和订阅者简化事件传递,这里的事件可以理解为消息,本文中统一称为事件也就是 Event。通过EventBus可以简化生产者/消费者 这种模型,同时又可以通过...

    Node.js-EventBusOttoRxBus事件总线使用

    Otto是Square公司为Android开发的事件总线库,它的设计灵感来源于Guava库的 EventBus。Otto同样提供了发布/订阅模型,但相比于EventBus,它的API更为简单。发布事件时,调用`Bus.post()`方法,订阅事件时,使用`@...

    camel-guava-eventbus-2.11.0-sources.jar

    jar包,亲测可用

    SpringBoot+EventBus使用教程示例代码

    在本文中,我们将深入探讨如何在SpringBoot应用中使用EventBus,这是一个基于Guava库的事件总线系统。EventBus的引入使得松耦合的组件间通信变得更加简单和高效。让我们一起通过步骤来理解这个“SpringBoot+EventBus...

    geeteventbus:用于高度并发的Python应用程序的进程内事件总线

    但这与Guava事件总线库并不完全相同。 geeteventbus简化了来自发布者和订阅者的事件处理。 发布者和订阅者不需要创建线程来同时处理事件。 eventbus可以是syncnus,其中事件是从发布事件的同一线程传递的可以按照...

    camel-guava-eventbus-2.11.1.jar

    jar包,亲测可用

    不加密Google Guava视频教程.txt

    ├─Google Guava 第19讲-Guava之EventBus和NIO2.0 WatchService综合实战.wmv ├─Google Guava 第20讲-实战:手动实现一个EventBus-01快速搭建程序结构.wmv ├─Google Guava 第21讲-实战:手动实现一个EventBus-...

    Guava 工程项目包 有实例

    - **事件监听**:Guava 提供了 EventBus,一个简单的发布/订阅事件总线,方便组件间的通信。 - **时间处理**:Guava 提供了更加易用的时间处理 API,如 Duration 和 Period,弥补了 Java 标准库中对时间操作的不足...

    guava_programming.zip

    本资料主要围绕Guava中的两个关键特性进行探讨:函数式接口及其在Guava中的应用,以及Guava的EventBus事件总线机制的源码分析和使用经验。 首先,我们来了解一下Guava中的函数式接口。函数式接口是指只有一个抽象...

    guava-18.0(guava-18.0.jar和guava-18.0-sources.jar)

    8. **事件监听**:Guava的EventBus可以方便地实现发布/订阅模式,简化事件驱动的编程。 9. **枚举集与常量**:Guava提供了ImmutableEnumSet和ImmutableSet.of()等方法,创建不可变且高效的枚举集合。 `guava-18.0-...

    基于Google Guava和Spring AOP的Java事件总线组件设计源码

    该项目是一款基于Google Guava和Spring AOP构建的Java事件总线组件源码,共包含47个文件,包括30个Java源文件、6个XML配置文件、2个YAML文件、2个批处理文件等。该组件支持同步和异步事件处理模式,采用注解式发布...

    EventBus-master

    EventBus 的核心概念包括发布(Posting)事件、订阅(Subscribing)事件和粘性事件(Sticky Events)。 1. 发布事件(Posting Events): 开发者可以通过调用 EventBus 的 `post()` 方法来发送事件。这个方法接收...

    Node.js-EventBus简单使用实例学习使用开源库提高开发效率与速度

    EventBus是一种发布/订阅事件总线,它简化了组件之间的通信,使得Android应用的架构更加清晰,同时也降低了组件间的耦合度。 首先,我们了解下什么是EventBus。EventBus是Android中一个轻量级的事件总线库,由...

    fact-bus:基于guava整合spring实现EventBus;具体详情请访问:https

    SNAPSHOTMaven依赖&lt;dependency&gt;&lt;groupId&gt;com.woter.fact&lt;/groupId&gt;&lt;artifactId&gt;fact-bus&lt;/artifactId&gt;&lt;version&gt;1.0.0-SNAPSHOT&lt;/version&gt;&lt;/dependency&gt;功能描述fact-bus 是基于guava整合spring实现EventBus;...

    Android和Java的事件总线,简化了activity、Fragments、thread、Services等之间的.zip

    EventBus是一个发布/订阅事件总线,灵感来自于Guava的 EventBus 和 Otto。它的主要优点是解耦组件,避免了传统回调方法导致的复杂性。下面将详细讲解EventBus的基本概念、使用方法和优势。 1. **基本概念**: - **...

    camel-guava-eventbus-2.11.0.jar

    jar包,亲测可用

    camel-guava-eventbus-2.10.6.jar

    jar包,亲测可用

    camel-guava-eventbus-2.10.5.jar

    jar包,亲测可用

Global site tag (gtag.js) - Google Analytics