Table of Contents
EventBus 是 Guava 的事件处理机制,是观察者模式(生产/消费模型)的一种实现。
观察者模式在我们日常开发中使用非常广泛,例如在订单系统中,订单状态或者物流信息的变更会向用户发送APP推送、短信、通知卖家、买家等等;审批系统中,审批单的流程流转会通知发起审批用户、审批的领导等等。
Observer模式也是 JDK 中自带就支持的,其在 1.0 版本就已经存在 Observer,不过随着 Java 版本的飞速升级,其使用方式一直没有变化,许多程序库提供了更加简单的实现,例如 Guava EventBus、RxJava、EventBus 等
EventBus 优点
缺点
如果需要分布式使用还是需要使用
Gradle
Maven
引入依赖后,这里我们主要使用 类进行操作,其提供了 、、 来进行注册订阅、取消订阅和发布消息
1. 首先创建一个 EventBus
2. 创建一个订阅者
在 Guava EventBus 中,是根据参数类型进行订阅,每个订阅的方法只能由一个参数,同时需要使用 标识
3. 注册到 EventBus 上并发布消息
运行结果为
根据需要我们可以创建多个订阅者完成订阅信息,同时如果一个类型存在多个订阅者,则所有订阅方法都会执行
为什么说这么做是同步的呢?
Guava Event 实际上是使用线程池来处理订阅消息的,通过源码可以看出,当我们使用默认的构造方法创建 的时候,其中 为 ,其具体实现中直接调用的 方法,使其仍然在同一个线程中执行,所以默认操作仍然是同步的,这种处理方法也有适用的地方,这样既可以解耦也可以让方法在同一个线程中执行获取同线程中的便利,比如事务的处理
EventBus 部分源码
DirectExecutor 部分源码
通过上面的源码,可以看出只要将构造方法中的 executor 换成一个线程池实现即可, 同时 Guava EventBus 为了简化操作,提供了一个简化的方案即
这样即可实现异步使用
AsyncEventBus 源码
如果处理时发生异常应该如何处理? 在看源码中,无论是 还是 都可传入自定义的 该 handler 当出现异常时会被调用,我可可以从参数 获取异常信息,从 中获取消息信息进行特定的处理
其接口声明为
在上面的基础上,我们可以定义一些消息类型来实现不同消息的监听和处理,通过实现 来处理异常的情况,无论时同步还是异步都能游刃有余
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/15193.html