Guava EventBus 使用

EventBus 是 Google Guava 提供的消息发布-订阅类库,是设计模式中的观察者模式(生产/消费者编程模型)的优雅实现,消息通知负责人通过 EventBus 去注册/注销观察者,最后由消息通知负责人给观察者发布消息。
对于事件监听和发布订阅模式,EventBus 是一个非常优雅和简单解决方案,我们不用创建复杂的类和接口层次结构。

基本用法

创建事件监听器-Listener

我们只需要在指定的方法上加上 @Subscribe 注解就可以使其变成一个 Listener,这样便能订阅消息了。

/*** SimpleListener 监听器*/
public class SimpleListener {/*** 一个简单的 Listener 方法,监听 String 类型的消息*/@Subscribepublic void handle(String event){System.out.println("String message: " + event);}
}

创建 EventBus 推送消息

创建 EventBus 事件总线,注册事件监听器,并推送消息。

public class SimpleEventBusMain {public static void main(String[] args) {final EventBus eventBus = new EventBus();// 注册事件监听器eventBus.register(new SimpleListener());// 向订阅者发送消息eventBus.post("Hello EventBus");}
}

输出结果

String message: Hello EventBus

多事件类型的监听

只需要在要订阅消息的方法上加上 @Subscribe 注解就可以实现对多个不同消息的监听。并且, EventBus 会根据方法参数类型的不同,分别向不同的订阅者 Subscribe 推送不同的消息。参数类型不同,订阅者就不同。

创建 EventBus

/*** JobEventBusCenter*/
public final class JobEventBusCenter {private static class JobEventBus {private static final EventBus EVENT_BUS = new EventBus();}public static void register(JobEventListener<?> listener) {JobEventBus.EVENT_BUS.register(listener);}public static void post(JobEvent<?> event) {JobEventBus.EVENT_BUS.post(event);}}

创建不同的消息事件

  • 抽象 JobEvent 类
/*** JobEvent*/
public abstract class JobEvent<T> extends EventObject {public JobEvent(T source) {super(source);}@Overridepublic T getSource() {return (T) super.getSource();}
}
  • JobEventString 类,String 类型的消息事件
/*** String 类型的消息对象*/
public class JobEventString extends JobEvent<String> {public JobEventString(String source) {super(source);}@Overridepublic String getSource() {return super.getSource();}
}
  • JobEventInteger 类,Integer 类型的消息事件
/*** Integer 类型的消息对象*/
public class JobEventInteger extends JobEvent<Integer> {public JobEventInteger(Integer source) {super(source);}@Overridepublic Integer getSource() {return super.getSource();}
}

创建事件监听器

  • JobEventListener 接口
/*** 事件监听器接口*/
public interface JobEventListener<T> {void handle(T event);
}
  • JobEventStringListener 类,用于监听 String 类型的消息
/*** JobEventStringListener*/
public class JobEventStringListener implements JobEventListener<JobEventString> {@Override@Subscribepublic void handle(JobEventString event) {String source = event.getSource();System.out.println("String message: " + source);}
}
  • JobEventIntegerListener 类,用于监听 Integer 类型的消息
/*** JobEventIntegerListener*/
public class JobEventIntegerListener implements JobEventListener<JobEventInteger> {@Override@Subscribepublic void handle(JobEventInteger event) {Integer source = event.getSource();System.out.println("Integer message: " + source);}
}

创建 EventBus

  • JobEventBusCenter 类,封装 EventBus 的功能
/*** JobEventBusCenter*/
public final class JobEventBusCenter {private static class JobEventBus {private static final EventBus EVENT_BUS = new EventBus();}public static void register(JobEventListener<?> listener) {JobEventBus.EVENT_BUS.register(listener);}public static void post(JobEvent<?> event) {JobEventBus.EVENT_BUS.post(event);}}
  • EventBusMain 类
/*** EventBusMain*/
public class EventBusMain {public static void main(String[] args) {JobEventIntegerListener integerListener = new JobEventIntegerListener();JobEventStringListener stringListener = new JobEventStringListener();// 注册事件监听器JobEventBusCenter.register(integerListener);JobEventBusCenter.register(stringListener);// 发送事件JobEventBusCenter.post(new JobEventString("hello eventBus"));JobEventBusCenter.post(new JobEventInteger(123));}
}

输出结果

String message: hello eventBus
Integer message: 123

继承关系的 Event

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

  • 具有继承关系的两个类
/*** Animal*/
public class Animal {private String name;public Animal(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}/*** Dog*/
public class Dog extends Animal {public Dog(String name) {super(name);}
}
  • 监听器
/*** AnimalListener*/
public class AnimalListener {@Subscribepublic void handle(Animal animal) {System.out.println("Animal name: " + animal.getName());}@Subscribepublic void handle(Dog dog) {System.out.println("Dog name: " + dog.getName());}
}
  • 创建 EventBus
public class EventBusMain {public static void main(String[] args) {final EventBus eventBus = new EventBus();// 注册事件监听器eventBus.register(new AnimalListener());// 向订阅者发送消息eventBus.post(new Dog("dingding"));}
}

Dog name: dingding
Animal name: dingding

注意

  1. 使用 EventBus 时,监听方法的参数有且只能有一个,必须是引用类型,不能是基本数据类型,如:int 要换成 Integer,long 要缓存 Long 等等;
  2. 由于 EventBus 是将消息队列放入到内存中的,由 Listener 消费这个消息队列,故系统重启之后,保存或者堆积在队列中的消息丢失。

参考

Guide to Guava’s EventBus:https://www.baeldung.com/guava-eventbus#overview

Guava EventBus 使用相关推荐

  1. Guava库学习:学习Guava EventBus(二)EventBus 事件订阅示例

    2019独角兽企业重金招聘Python工程师标准>>> 原文地址:Guava库学习:学习Guava EventBus(二)EventBus 事件订阅示例 上一篇Guava库学习:学习 ...

  2. Google Guava EventBus用于事件编程

    在任何软件应用程序中都是如此,有些对象需要共享信息才能完成工作. 在Java应用程序中,实现信息共享的一种方法是拥有事件侦听器,其唯一目的是在发生所需事件时采取某些措施. 在大多数情况下,此过程有效, ...

  3. Google Guava EventBus和Java 7 WatchService用于事件编程

    这篇文章将介绍如何使用Guava EventBus将更改发布到Java 7 WatchService检测到的目录或子目录中. Guava EventBus是向应用程序添加发布/订阅通信的好方法. Ja ...

  4. java guava eventbus_JAVA | Guava EventBus 使用

    JAVA | Guava EventBus 使用 系列文章目录 Table of Contents [TOC] 前言 EventBus 是 Guava 的事件处理机制,是观察者模式(生产/消费模型)的 ...

  5. Guava EventBus 和 AsynEventBus

    2019独角兽企业重金招聘Python工程师标准>>> 一.适用场景 很多时候一个事件会触发很多其他的事件,比如说一个充值操作,可能会设计到一些其他的操作,比如充值完成会奖励一些抽奖 ...

  6. Guava事件处理组件Eventbus使用入门

    1.说明 EventBus是Google Guava的事件处理机制, 是设计模式中观察者模式的优雅实现, 是一个进程内的生产者/消费者模型. 为了解耦事件的发布和订阅, 使用EventBus组件, 是 ...

  7. EventBus VS Spring Event

    EventBus VS Spring Event 本地异步处理,采用事件机制 可以使 代码解耦,更易读.事件机制实现模式是 观察者模式(或发布订阅模式),主要分为三部分:发布者.监听者.事件. Gua ...

  8. Guava关于JAVA中系统组件之间交互通讯(非线程之间通讯)

    2019独角兽企业重金招聘Python工程师标准>>> Guava EventBus组件 // Class is typically registered by the contai ...

  9. Guava、Spring 如何抽象观察者模式?

    什么是观察者模式 观察者模式 是一种行为设计模式,允许定义一种订阅通知机制,可以在对象(被观察者)事件发生时通知多个 "观察" 该对象的观察者对象,所以也被称为 发布订阅模式 其实 ...

最新文章

  1. 如何判断两个单向链表是否有相交,并找出交点
  2. linux文件名通配符:* ? [:digit:]数字 [:lower:]小写字母 [:upper:]大写字母
  3. C++primer 10.2.1节练习
  4. 广州测试沙龙的问题。
  5. Linux系统维护人员的必备参考书
  6. docker给php装swoole,制作php+swoole的Docker环境
  7. Python实现向量自回归(VAR)模型——完整步骤
  8. 用python做股票因子分析_因子分析(by+alphalens)
  9. mysql升级 windows10_Windows10系统MySQL5.7升级到8.0
  10. [gdc13]古墓丽影DirectX11技术
  11. 台式机安装纯ubuntu系统的操作步骤
  12. 明明安装了模块/包,Python提示无包/模块/报错
  13. 一个大专生的java从业心路历程
  14. 2022网易云前端+nodejs后端API项目部署全解
  15. 【网络原理】一个数据包从发送到接收在网络中经历了那些过程(详细分析)
  16. Windows10环境下设置播放器默认软件打开方式
  17. 小程序实现活动倒计时功能
  18. 解决winscp中普通用户无法上传、删除、移动文件
  19. BWK210-180-05电压输出单轴倾角传感器的使用
  20. echarts name 坐标轴_从零打造Echarts —— v1 ZRender和MVC

热门文章

  1. 异步社区|本周半价电子书书单
  2. 初次使用CentOS下gedit
  3. 2022全国地区年终奖绩效调研报告
  4. 编译原理(8):代码优化
  5. 24个笔画顺序表田字格_衡水体26个英文字母写法,现在开始练还不晚
  6. 东芝存储器株式会社推出存储容量更高的XG6-P SSD系列以满足性能要求较高的工作负载需求
  7. 惯性导航系统学习笔记——第二讲
  8. 第六篇:方法一(学会自己设置赔率和盘口)
  9. 光纤收发器指示灯及常见问题详解
  10. 4G AI 智能模块 - MT8788 (I500P)