`

Google Guava EventBus简化生产/消费者模式使用

阅读更多


在Google Guava 10版本引入了EventBus, 它主要用来简化我们处理生产/消费者编程模型.

基本用法
使用Guava之后, 如果要订阅消息, 就不用再继承指定的接口, 只需要在指定的方法上加上@Subscribe注解即可:

public class EventListener {
 
    public int lastMessage = 0;
 
    @Subscribe
    public void listen(OurTestEvent event) {
        lastMessage = event.getMessage();
    }
 
    public int getLastMessage() {
        return lastMessage;
    }
}


上面的lastMessage用来接收消息.

下面定义的类用来对消息进行封装:

public class OurTestEvent {
 
    private final int message;
 
    public OurTestEvent(int message) {
        this.message = message;
    }
 
    public int getMessage() {
        return message;
    }
}


通过写一个测试来了解EventBus如何工作:

@Test
public void shouldReceiveEvent() throws Exception {
 
    // given
    EventBus eventBus = new EventBus("test");
    EventListener listener = new EventListener();
 
    eventBus.register(listener);
 
    // when
    eventBus.post(new OurTestEvent(200));
 
    // then
    assertThat(listener.getLastMessage()).isEqualTo(200);
}


上面的测试是不是很简单?

MultiListener的使用

只需要在要订阅消息的方法上加上@Subscribe注解即可实现对多个消息的订阅:
public class MultipleListener {
 
    public Integer lastInteger;
    public Long lastLong;
 
    @Subscribe
    public void listenInteger(Integer event) {
        lastInteger = event;
    }
 
    @Subscribe
    public void listenLong(Long event) {
        lastLong = event;
    }
 
    public Integer getLastInteger() {
        return lastInteger;
    }
 
    public Long getLastLong() {
        return lastLong;
    }
}


下面是对应的测试:

@Test
public void shouldReceiveMultipleEvents() throws Exception {
 
    // given
    EventBus eventBus = new EventBus("test");
    MultipleListener multiListener = new MultipleListener();
 
    eventBus.register(multiListener);
 
    // when
    eventBus.post(new Integer(100));
    eventBus.post(new Long(800));
 
    // then
    assertThat(multiListener.getLastInteger()).isEqualTo(100);
    assertThat(multiListener.getLastLong()).isEqualTo(800L);
}


高级用法

1.Dead Event

如果EventBus发送的消息都不是订阅者关心的称之为Dead Event. 看下面的例子:
/**
 * Listener waiting for the event that any message was posted but not delivered to anyone
 */
public class DeadEventListener {
 
    boolean notDelivered = false;
 
    @Subscribe
    public void listen(DeadEvent event) {
        notDelivered = true;
    }
 
    public boolean isNotDelivered() {
        return notDelivered;
    }
}


下面是测试类:

@Test
public void shouldDetectEventWithoutListeners() throws Exception {
 
    // given
    EventBus eventBus = new EventBus("test");
 
    DeadEventListener deadEventListener = new DeadEventListener();
    eventBus.register(deadEventListener);
 
    // when
    eventBus.post(new OurTestEvent(200));
 
    assertThat(deadEventListener.isNotDelivered()).isTrue();
}


如果没有消息订阅者监听消息, EventBus将发送DeadEvent消息, 这时我们可以通过log的方式来记录这种状态.

2.Event的继承

如果Listener A监听Event A, 而Event A有一个子类Event B, 此时Listener A将同时接收Event A和B消息

看下面的例子:

public class NumberListener {
 
    private Number lastMessage;
 
    @Subscribe
    public void listen(Number integer) {
        lastMessage = integer;
    }
 
    public Number getLastMessage() {
        return lastMessage;
    }
}

	
public class IntegerListener {
 
    private Integer lastMessage;
 
    @Subscribe
    public void listen(Integer integer) {
        lastMessage = integer;
    }
 
    public Integer getLastMessage() {
        return lastMessage;
    }
}


对应的测试类:


@Test
public void shouldGetEventsFromSubclass() throws Exception {
 
    // given
    EventBus eventBus = new EventBus("test");
    IntegerListener integerListener = new IntegerListener();
    NumberListener numberListener = new NumberListener();
    eventBus.register(integerListener);
    eventBus.register(numberListener);
 
    // when
    eventBus.post(new Integer(100));
 
    // then
    assertThat(integerListener.getLastMessage()).isEqualTo(100);
    assertThat(numberListener.getLastMessage()).isEqualTo(100);
 
    //when
    eventBus.post(new Long(200L));
 
    // then
    // this one should has the old value as it listens only for Integers
    assertThat(integerListener.getLastMessage()).isEqualTo(100);
    assertThat(numberListener.getLastMessage()).isEqualTo(200L);
}



参考原文:http://tomaszdziurko.pl/2012/01/google-guava-eventbus-easy-elegant-publisher-subscriber-cases/
分享到:
评论

相关推荐

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

    通过EventBus可以简化生产者/消费者 这种模型,同时又可以通过Executor来控制线程,使用起来非常优雅灵活。异步的则使用AsyncEventBus,如果需要强制使EventBus同步执行则可以使用@AllowConcurrentE

    Guava 工程项目包 有实例

    Guava 是一个由 Google 开发并维护的 Java 库,它提供了许多实用工具类和集合框架的增强功能,极大地丰富了 Java 平台的标准库。Guava 的目标是解决 Java 开发人员在日常工作中遇到的各种常见问题,提高开发效率和...

    Google Guava 官方教程

    Google Guava 是一个广泛使用的 Java 库,它提供了一系列现代编程实用工具,旨在简化常见的编程任务。Guava 提供了集合框架的扩展、并发支持、缓存机制、字符串处理工具、I/O 工具以及许多其他功能。这个官方教程将...

    SpringBoot+EventBus使用教程示例代码

    EventBus是Google Guava库的一部分,它提供了一种发布/订阅模式的事件传递机制,允许应用程序的不同组件之间进行异步通信,而无需直接引用彼此。 **二、EventBus的使用** 1. **依赖添加**:首先,在SpringBoot项目...

    guava_programming.zip

    《深入理解Google Guava:函数式接口与EventBus解析》 Google Guava是Google推出的一个开源库,它为Java开发人员提供了一套丰富的工具类和集合框架,极大地提高了开发效率和代码质量。本资料主要围绕Guava中的两个...

    google guava 中文教程

    本教程将深入探讨Guava库中的核心特性和使用方法。 一、集合框架扩展 Guava提供了对Java集合框架的增强,包括新的集合类型如Multiset(多集)、Multimap(多映射)和Immutable集合(不可变集合)。这些集合类型...

    Guava常用类库 v33.0.0.zip

    Guava是Google开发的一个Java库,它包含许多Google核心库中的高级集合、缓存、原生类型支持、并发包、字符串处理、I/O等工具类。版本33.0.0是Guava的一个更新,提供了最新的功能改进和错误修复。在深入探讨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.jar

    谷歌Guava,全称为Google Guava,是Google推出的一款Java库,它包含一系列基础工具类,旨在简化Java开发工作,提高代码效率和可维护性。Guava的核心特性包括集合框架、缓存、原始类型支持、并发库、字符串处理、I/O...

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

    它的设计灵感来源于Google的Guava库中的 EventBus,但更专注于Android环境。通过EventBus,我们可以避免使用静态方法、BroadcastReceiver或者Intent进行繁琐的组件间通信,而是通过发布和订阅事件来进行解耦通信。 ...

    Guava 16.0 API (CHM格式)

    Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libraries, common annotations, string processing, I/O, 等等. 这些高质量的 API 可以使你...

    Getting Started with Google Guava

    《Getting Started with Google Guava》是一本面向初学者的指南,旨在帮助读者快速掌握Google Guava库的使用。Google Guava是Google推出的一个Java库,它包含了大量的实用工具类,可以极大地提高开发效率并简化代码...

    Google Guava 30.1.1常用类介绍及实践代码

    以上只是 Guava 30.1.1 版本中的一部分核心功能,实际使用中还有许多其他实用工具类,如 `Range`, `EventBus`, `RateLimiter` 等。Guava 的设计目标是提高代码质量和效率,通过提供这些工具类,开发者可以更加专注于...

    EventBus-master

    这个库的设计灵感来源于 Google 的 Guava 项目中的 EventBus,但针对 Android 平台进行了优化,使得它在处理组件间的异步通信时更加高效且易于使用。在 Android 开发中,EventBus 提供了一种替代传统 Intent、...

    Android Studio中 EventBus的使用demo(一) 下载

    在Android应用开发中,EventBus是一...总结,EventBus简化了Android组件间的通信,提高了代码的可读性和可维护性。通过上述步骤,开发者可以在Android Studio中快速地实现EventBus的集成和使用,实现组件间的高效通信。

    guava-18.0资料

    Guava是Google开发的一个核心库,它为Java平台提供了许多实用工具类,极大地丰富了Java标准库的功能。这个"guava-18.0资料"包含的资源是Guava库的18.0版本,该版本是Guava的一个稳定版本,提供了一系列改进和新特性...

    guava14.0.1jar包

    8. **事件监听**:Guava的EventBus是一种发布-订阅事件总线,用于组件之间的松耦合通信,可以替代传统的监听器模式。 9. ** Predicates和Conditions**:Guava提供了预定义和自定义的谓词(Predicate)和条件...

    guava学习知识点

    Guava 是 Google 开源的一个 Java 工具包,包含了丰富的工具类和库,极大地扩展了 Java 的功能。这里我们详细探讨一下 Guava 的主要知识点。 1. **RateLimiter 和 Semaphore 的区别** - `RateLimiter` 主要用于...

    guava-26.0-jre.zip

    Guava是Google为Java平台设计并维护的一个开源库,它提供了许多高级功能和实用工具,极大地增强了Java开发的效率和代码质量。Guava 26.0-jre版本是针对Java运行时环境(JRE)优化的一个特定版本,旨在更好地支持Java...

    guava-jdk5

    这个版本包含了Guava的核心特性,使得开发者在使用Java 5时也能享受到Guava带来的便利。 1. **集合框架扩展**:Guava对Java内置的集合框架进行了扩展和增强,提供了如Multiset(多频度集)、Multimap(多值映射)和...

Global site tag (gtag.js) - Google Analytics