电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

JAVA | Guava EventBus 使用 發(fā)布/訂閱模式的步驟

瀏覽:66日期:2022-08-16 08:17:38
前言

EventBus 是 Guava 的事件處理機制,是觀察者模式(生產(chǎn)/消費模型)的一種實現(xiàn)。

觀察者模式在我們?nèi)粘i_發(fā)中使用非常廣泛,例如在訂單系統(tǒng)中,訂單狀態(tài)或者物流信息的變更會向用戶發(fā)送APP推送、短信、通知賣家、買家等等;審批系統(tǒng)中,審批單的流程流轉(zhuǎn)會通知發(fā)起審批用戶、審批的領(lǐng)導(dǎo)等等。

Observer模式也是 JDK 中自帶就支持的,其在 1.0 版本就已經(jīng)存在 Observer,不過隨著 Java 版本的飛速升級,其使用方式一直沒有變化,許多程序庫提供了更加簡單的實現(xiàn),例如 Guava EventBus、RxJava、EventBus 等

一、為什么要用 Observer模式以及 EventBus 優(yōu)點 ?

EventBus 優(yōu)點

相比 Observer 編程簡單方便 通過自定義參數(shù)可實現(xiàn)同步、異步操作以及異常處理 單進程使用,無網(wǎng)絡(luò)影響

缺點

只能單進程使用 項目異常重啟或者退出不保證消息持久化

如果需要分布式使用還是需要使用 MQ

二、EventBus 使用步驟1. 引入庫

Gradle

compile group: ’com.google.guava’, name: ’guava’, version: ’29.0-jre’

Maven

<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>29.0-jre</version></dependency>

引入依賴后,這里我們主要使用 com.google.common.eventbus.EventBus 類進行操作,其提供了 register、unregister、post 來進行注冊訂閱、取消訂閱和發(fā)布消息

public void register(Object object);public void unregister(Object object);public void post(Object event);2. 同步使用

1. 首先創(chuàng)建一個 EventBus

EventBus eventBus = new EventBus();

2. 創(chuàng)建一個訂閱者

在 Guava EventBus 中,是根據(jù)參數(shù)類型進行訂閱,每個訂閱的方法只能由一個參數(shù),同時需要使用 @Subscribe 標識

class EventListener { /** * 監(jiān)聽 Integer 類型的消息 */ @Subscribe public void listenInteger(Integer param) { System.out.println('EventListener#listenInteger ->' + param); } /** * 監(jiān)聽 String 類型的消息 */ @Subscribe public void listenString(String param) { System.out.println('EventListener#listenString ->' + param); }}

3. 注冊到 EventBus 上并發(fā)布消息

EventBus eventBus = new EventBus();eventBus.register(new EventListener());eventBus.post(1);eventBus.post(2);eventBus.post('3');

運行結(jié)果為

EventListener#listenInteger ->1EventListener#listenInteger ->2EventListener#listenString ->3

根據(jù)需要我們可以創(chuàng)建多個訂閱者完成訂閱信息,同時如果一個類型存在多個訂閱者,則所有訂閱方法都會執(zhí)行

為什么說這么做是同步的呢?

Guava Event 實際上是使用線程池來處理訂閱消息的,通過源碼可以看出,當我們使用默認的構(gòu)造方法創(chuàng)建 EventBus 的時候,其中 executor 為 MoreExecutors.directExecutor(),其具體實現(xiàn)中直接調(diào)用的 Runnable#run 方法,使其仍然在同一個線程中執(zhí)行,所以默認操作仍然是同步的,這種處理方法也有適用的地方,這樣既可以解耦也可以讓方法在同一個線程中執(zhí)行獲取同線程中的便利,比如事務(wù)的處理

EventBus 部分源碼

public class EventBus { private static final Logger logger = Logger.getLogger(EventBus.class.getName()); private final String identifier; private final Executor executor; private final SubscriberExceptionHandler exceptionHandler; private final SubscriberRegistry subscribers; private final Dispatcher dispatcher; public EventBus() { this('default'); } public EventBus(String identifier) { this(identifier, MoreExecutors.directExecutor(), Dispatcher.perThreadDispatchQueue(), EventBus.LoggingHandler.INSTANCE); } public EventBus(SubscriberExceptionHandler exceptionHandler) { this('default', MoreExecutors.directExecutor(), Dispatcher.perThreadDispatchQueue(), exceptionHandler); } EventBus(String identifier, Executor executor, Dispatcher dispatcher, SubscriberExceptionHandler exceptionHandler) { this.subscribers = new SubscriberRegistry(this); this.identifier = (String)Preconditions.checkNotNull(identifier); this.executor = (Executor)Preconditions.checkNotNull(executor); this.dispatcher = (Dispatcher)Preconditions.checkNotNull(dispatcher); this.exceptionHandler = (SubscriberExceptionHandler)Preconditions.checkNotNull(exceptionHandler); }}

DirectExecutor 部分源碼

enum DirectExecutor implements Executor { INSTANCE; private DirectExecutor() { } public void execute(Runnable command) { command.run(); } public String toString() { return 'MoreExecutors.directExecutor()'; }}3. 異步使用

通過上面的源碼,可以看出只要將構(gòu)造方法中的 executor 換成一個線程池實現(xiàn)即可, 同時 Guava EventBus 為了簡化操作,提供了一個簡化的方案即 AsyncEventBus

EventBus eventBus = new AsyncEventBus(Executors.newCachedThreadPool());

這樣即可實現(xiàn)異步使用

AsyncEventBus 源碼

public class AsyncEventBus extends EventBus { public AsyncEventBus(String identifier, Executor executor) { super(identifier, executor, Dispatcher.legacyAsync(), LoggingHandler.INSTANCE); } public AsyncEventBus(Executor executor, SubscriberExceptionHandler subscriberExceptionHandler) { super('default', executor, Dispatcher.legacyAsync(), subscriberExceptionHandler); } public AsyncEventBus(Executor executor) { super('default', executor, Dispatcher.legacyAsync(), LoggingHandler.INSTANCE); }}4. 異常處理

如果處理時發(fā)生異常應(yīng)該如何處理? 在看源碼中,無論是 EventBus 還是 AsyncEventBus 都可傳入自定義的 SubscriberExceptionHandler 該 handler 當出現(xiàn)異常時會被調(diào)用,我可可以從參數(shù) exception 獲取異常信息,從 context 中獲取消息信息進行特定的處理

其接口聲明為

public interface SubscriberExceptionHandler { /** Handles exceptions thrown by subscribers. */ void handleException(Throwable exception, SubscriberExceptionContext context);}總結(jié)

在上面的基礎(chǔ)上,我們可以定義一些消息類型來實現(xiàn)不同消息的監(jiān)聽和處理,通過實現(xiàn) SubscriberExceptionHandler 來處理異常的情況,無論時同步還是異步都能游刃有余

參考

https://github.com/google/guavahttps://github.com/greenrobot/EventBushttps://github.com/ReactiveX/RxJava

以上就是JAVA | Guava EventBus 使用 發(fā)布/訂閱模式的步驟的詳細內(nèi)容,更多關(guān)于Guava EventBus 使用 發(fā)布/訂閱模式的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標簽: Java
相關(guān)文章:
主站蜘蛛池模板: 等离子空气净化器_医用空气消毒机_空气净化消毒机_中央家用新风系统厂家_利安达官网 | 包头市鑫枫装饰有限公司| 百度关键词优化_网站优化_SEO价格 - 云无限好排名 | ALC墙板_ALC轻质隔墙板_隔音防火墙板_轻质隔墙材料-湖北博悦佳 | 山东限矩型液力偶合器_液力耦合器易熔塞厂家-淄博市汇川源机械厂 | 江苏全风,高压风机,全风环保风机,全风环形高压风机,防爆高压风机厂家-江苏全风环保科技有限公司(官网) | 印刷人才网 印刷、包装、造纸,中国80%的印刷企业人才招聘选印刷人才网! | 塑胶地板-商用PVC地板-pvc地板革-安耐宝pvc塑胶地板厂家 | 碳纤维复合材料制品生产定制工厂订制厂家-凯夫拉凯芙拉碳纤维手机壳套-碳纤维雪茄盒外壳套-深圳市润大世纪新材料科技有限公司 | 溶氧传感器-pH传感器|哈美顿(hamilton) | 苏州教学设备-化工教学设备-环境工程教学模型|同科教仪 | 美国HASKEL增压泵-伊莱科elettrotec流量开关-上海方未机械设备有限公司 | 中开泵,中开泵厂家,双吸中开泵-山东博二泵业有限公司 | 山东钢衬塑罐_管道_反应釜厂家-淄博富邦滚塑防腐设备科技有限公司 | 泰国试管婴儿_泰国第三代试管婴儿费用|成功率|医院—新生代海外医疗 | 茶楼装修设计_茶馆室内设计效果图_云臻轩茶楼装饰公司 | 应急灯_消防应急灯_应急照明灯_应急灯厂家-大成智慧官网 | 扬尘在线监测系统_工地噪声扬尘检测仪_扬尘监测系统_贝塔射线扬尘监测设备「风途物联网科技」 | 真空冷冻干燥机_国产冻干机_冷冻干燥机_北京四环冻干 | 信阳网站建设专家-信阳时代网联-【信阳网站建设百度推广优质服务提供商】信阳网站建设|信阳网络公司|信阳网络营销推广 | 懂研帝_专业SCI论文润色机构_SCI投稿发表服务公司 | 消泡剂_水处理消泡剂_切削液消泡剂_涂料消泡剂_有机硅消泡剂_广州中万新材料生产厂家 | 青岛代理记账_青岛李沧代理记账公司_青岛崂山代理记账一个月多少钱_青岛德辉财税事务所官网 | 哈尔滨发电机,黑龙江柴油发电机组-北方星光 | 沧州友城管业有限公司-内外涂塑钢管-大口径螺旋钢管-涂塑螺旋管-保温钢管生产厂家 | 儿童语言障碍训练-武汉优佳加感统文化发展有限公司 | 东莞螺丝|东莞螺丝厂|东莞不锈钢螺丝|东莞组合螺丝|东莞精密螺丝厂家-东莞利浩五金专业紧固件厂家 | 天命文免费算命堂_自助算命_自由算命系统_长文周易 | 兰州牛肉面加盟,兰州牛肉拉面加盟-京穆兰牛肉面 | 外贸网站建设-外贸网站设计制作开发公司-外贸独立站建设【企术】 | 无锡门窗-系统门窗-阳光房-封阳台-断桥铝门窗厂[窗致美] | uv固化机-丝印uv机-工业烤箱-五金蚀刻机-分拣输送机 - 保定市丰辉机械设备制造有限公司 | pbt头梳丝_牙刷丝_尼龙毛刷丝_PP塑料纤维合成毛丝定制厂_广州明旺 | 洁净化验室净化工程_成都实验室装修设计施工_四川华锐净化公司 | 臭氧发生器_臭氧消毒机 - 【同林品牌 实力厂家】 | 混合气体腐蚀试验箱_盐雾/硫化氢/气体腐蚀试验箱厂家-北京中科博达 | 西安展台设计搭建_西安活动策划公司_西安会议会场布置_西安展厅设计西安旭阳展览展示 | 企业管理培训,企业培训公开课,企业内训课程,企业培训师 - 名课堂企业管理培训网 | 防水套管|柔性防水套管|伸缩器|伸缩接头|传力接头-河南伟创管道 防水套管_柔性防水套管_刚性防水套管-巩义市润达管道设备制造有限公司 | 山东活动策划|济南活动公司|济南公关活动策划-济南锐嘉广告有限公司 | 齿式联轴器-弹性联轴器-联轴器厂家-江苏诺兴传动联轴器制造有限公司 |