EventBusGoogle.Guava提供的消息发布-订阅组件,采用的是观察者模式(生产/消费者编程模型),

实现了多组件之间通信的解耦合,事件产生方和事件消费方实现解耦分离,提升了通信的简洁性。

相比MQ它更加轻量,易用,但一般只用于进程内部的通信,不能像MQ一样用于分布式系统的服务与服务之间的通信。

       EventBus包含3大核心部分:Event事件, Publisher事件发布者,Subscriber事件订阅者。

下面介绍一下它的使用方法:

一、在pom.xml中引入guava的依赖

<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>19.0</version></dependency>

二、自定义事件类

事件是EventBus之间相互通信的基本单位,一个Event可以是任何类型。

为了规范,我们一般在自定义事件类时会以Event作为类名的结尾,例:

import lombok.Data;/*** 自定义一个添加告警消息的事件*/
@Data
public class AddAlertMsgEvent {private String calcNodeCode;private String orgCode;}

三、事件监听

事件监听即事件的订阅者,就是接收事件的一方,这些订阅者需要在自己的方法上,添加@Subscribe注解声明自己为事件订阅者。

一般@Subscribe可以配合@AllowConcurrentEvents注解一起使用,这个注解是用来标识当前订阅者是线程安全的,可以减少同步开销。

例:

/*** 事件监听器*/
@Component
public class EventListener {@Subscribe@AllowConcurrentEventspublic void addAlertMsg(AddAlertMsgEvent event) {//在这里可以做你需要的处理}}

监听类里面可以写多个监听的方法,记得在方法上添加@Subscribe注解。

四、定义一个工具类用来获取EventBus和发送事件

事件发布者,就是发送事件到EventBus事件总线的一方,事件发布者调用Post()方法,将事件发给EventBus。

例:

import com.google.common.eventbus.AsyncEventBus;
import com.google.common.eventbus.EventBus;import java.util.concurrent.*;public class EventBusUtil {private static EventBus eventBus;private static AsyncEventBus asyncEventBus;private static Executor executor = new ThreadPoolExecutor(1, 10, 60,TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(100000), Executors.defaultThreadFactory(), new ThreadPoolExecutor.CallerRunsPolicy());/*** 异步事件单例模式* @return*/private static synchronized AsyncEventBus getAsyncEventBus() {if(asyncEventBus == null){asyncEventBus = new AsyncEventBus(executor);}return asyncEventBus;}/*** 同步事件单例模式* @return*/private static synchronized EventBus getEventBus() {if(eventBus == null) {eventBus = new EventBus();}return eventBus;}/*** 同步发送事件* @param event*/public static void post(Object event) {getEventBus().post(event);}/*** 异步发送事件* @param event*/public static void asyncPost(Object event) {getAsyncEventBus().post(event);}/*** 监听器注册* @param object*/public static void register(Object object) {getEventBus().register(object);getAsyncEventBus().register(object);}}

五、监听器(订阅者)注册

只有将监听器所在的类,注册到EventBus中,EventBus才能扫描到这个订阅者。

在项目启动的时候调用EventBusUtil.register(eventListener)即可,下面以我使用的SpringBoot项目为例:

@Order(1)
@Slf4j
@Component
@Configuration
public class ApplicationListenerImpl implements ApplicationListener<ApplicationReadyEvent> {@Resourceprivate EventListener eventListener;@Overridepublic void onApplicationEvent(ApplicationReadyEvent event) {log.info("ApplicationReadyEvent init restTemplate.");try {//监听器注册EventBusUtil.register(eventListener);} catch (Exception e) {log.error("初始化配置失败!", e);}log.info("ApplicationReadyEvent init restTemplates finished.");}}

六、使用EventBus

至此你就可以愉快的使用EventBus了,下面举个简单的例子:

//使用Eventbus添加告警信息
AddAlertMsgEvent addAlertMsgEvent = new AddAlertMsgEvent();
addAlertMsgEvent.setOrgCode(orgInfoEntity.getOrgCode());
addAlertMsgEvent.setCalcNodeCode(orgInfoEntity.getCalcNodeCode());
//发送异步事件
EventBusUtil.asyncPost(addAlertMsgEvent);

七、拓展:EventBus和AsyncEventBus使用区别

EventBus:同步事件总线

1.同步执行,事件发送方在发出事件之后,会等待所有的事件消费方执行完毕后,才会回来继续执行自己后面的代码。

2.事件发送方和事件消费方会在同一个线程中执行,消费方的执行线程取决于发送方。

3.同一个事件的多个订阅者,在接收到事件的顺序上面有不同。谁先注册到EventBus的,谁先执行,如果是在同一个类中的两个订阅者一起被注册到EventBus的情况,收到事件的顺序跟方法名有关。

AsyncEventBus:异步事件总线

1.异步执行,事件发送方异步发出事件,不会等待事件消费方是否收到,直接执行自己后面的代码。

2.在定义AsyncEventBus时,构造函数中会传入一个线程池。事件消费方收到异步事件时,消费方会从线程池中获取一个新的线程来执行自己的任务。

3.同一个事件的多个订阅者,它们的注册顺序跟接收到事件的顺序上没有任何联系,都会同时收到事件,并且都是在新的线程中,异步并发的执行自己的任务。

Google Guava的EventBus(事件总线)基本使用相关推荐

  1. 【EventBus】EventBus 事件总线框架简介 ( EventBus 使用流程 )

    文章目录 一.EventBus 事件总线框架简介 二.EventBus 使用流程 一.EventBus 事件总线框架简介 Android 中的事件传递机制 : 使用 Intent 在组件间传递信息 ; ...

  2. Google guava 事件总线 EventBus 进程内消息队列

    Google guava 事件总线 EventBus 创建事件总线流程 码代码 引入依赖 一个简单的事件处理 监听者 创建事件生产者总线.注册事件监听者.发送事件 运行结果 扩展 多个事件监听者加De ...

  3. vue 事件总线EventBus的概念、使用以及注意点

    vue组件中的数据传递最最常见的就是父子组件之间的传递.父传子通过props向下传递数据给子组件:子传父通过$emit发送事件,并携带数据给父组件.而有时两个组件之间毫无关系,或者他们之间的结构复杂, ...

  4. Qt 之 事件总线模型

    文章目录 Qt 之 开源事件总线模块 libgitlevtbus 模型 模块 Event EventBus Module ModuleDelegate TestCase Qt 之 开源事件总线模块 l ...

  5. Google Guava EventBus用于事件编程

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

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

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

  7. [Google Guava] 11-事件总线

    原文链接 译文连接 译者:沈义扬 传统上,Java的进程内事件分发都是通过发布者和订阅者之间的显式注册实现的.设计EventBus就是为了取代这种显示注册方式,使组件间有了更好的解耦.EventBus ...

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

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

  9. vue中央事件总线eventBus的简单理解和使用

    公共事件总线eventBus的实质就是创建一个vue实例,通过一个空的vue实例作为桥梁实现vue组件间的通信.它是实现非父子组件通信的一种解决方案. 用法如下: 第一步:项目中创建一个js文件(我通 ...

最新文章

  1. 2021年大数据Spark(十三):Spark Core的RDD创建
  2. 离群点检测算法-基础概念
  3. oracle安装问题: 11g安装未填写hosts导致弹窗错误
  4. Docker 学习笔记之二
  5. 修改FileZilla生成证书的有效期
  6. 北京大学:“巍巍上庠 国运所系”北大为时代发展而歌(附历年高考各省投档线)...
  7. dns服务期搭建使用_DNS添加反向查找区域
  8. cxf调用接口的几种方式_Java调用CXF WebService接口的两种方式实例
  9. js 返回上一页和刷新以及页面跳转
  10. Microsoft SQL Server Integration Service文章总结
  11. android 定时开关机,android 定时关机
  12. 【译】 Golang 中的垃圾回收(三):Go Pacing
  13. 如何计算前缀,网络,子网和主机号?
  14. Python一对一题目辅导「PTA 题目讲解·难度系数:基础」
  15. 08年十大可能被炒CEO出炉 AMD鲁毅智位列第一
  16. NBUT1225 NEW RDSP MODE I(快速幂,规律)
  17. MySQL之索引,执行计划及SQL优化
  18. 维护站点和建站时遇到的一些问题
  19. Tensorflow去掉warning
  20. 程序猿最讨厌康熙的哪个儿子?

热门文章

  1. oracle 报错54,oracle启动时报错ORA-00845 MEMORY_TARGET not supported on this system
  2. 《七夕》:给自己买机械键盘了
  3. 伺服电机概念原理介绍
  4. 信息论与编码之离散信源小结
  5. Winform屏蔽鼠标双击和右键
  6. 安卓学习日志 Day05 — MediaPlayer
  7. TX2安装、配置Qt Creator|完全版
  8. coreldraw做倒影总会让人发现有意想不到的效果呈现出来
  9. [转]OS X Mountain Lion 系统配置 Apache+Mysql+PHP 详细教程
  10. vue 计数器 按按钮加以或减一