日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

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

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

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

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

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

EventBus 優(yōu)點(diǎn)

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

缺點(diǎn)

只能單進(jìn)程使用 項(xiàng)目異常重啟或者退出不保證消息持久化

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

二、EventBus 使用步驟1. 引入庫(kù)

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 類進(jìn)行操作,其提供了 register、unregister、post 來(lái)進(jìn)行注冊(cè)訂閱、取消訂閱和發(fā)布消息

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

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

EventBus eventBus = new EventBus();

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

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

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. 注冊(cè)到 EventBus 上并發(fā)布消息

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

運(yùn)行結(jié)果為

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

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

為什么說(shuō)這么做是同步的呢?

Guava Event 實(shí)際上是使用線程池來(lái)處理訂閱消息的,通過(guò)源碼可以看出,當(dāng)我們使用默認(rèn)的構(gòu)造方法創(chuàng)建 EventBus 的時(shí)候,其中 executor 為 MoreExecutors.directExecutor(),其具體實(shí)現(xiàn)中直接調(diào)用的 Runnable#run 方法,使其仍然在同一個(gè)線程中執(zhí)行,所以默認(rèn)操作仍然是同步的,這種處理方法也有適用的地方,這樣既可以解耦也可以讓方法在同一個(gè)線程中執(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. 異步使用

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

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

這樣即可實(shí)現(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. 異常處理

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

其接口聲明為

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

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

參考

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

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

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩高清电影免费| 99在线精品免费视频九九视| 美女精品网站| 蜜臀va亚洲va欧美va天堂| 亚洲黑丝一区二区| 久久精品国产大片免费观看| 99久久精品费精品国产| 亚洲天堂黄色| 免费日韩av| 亚洲开心激情| 欧美久久香蕉| 成人午夜网址| 久久精品99久久无色码中文字幕| 久久视频国产| 丝瓜av网站精品一区二区| 亚洲人成在线影院| 国产亚洲观看| 成人在线视频中文字幕| 亚洲成人一区在线观看| 欧美色图一区| 蜜桃久久精品一区二区| 日韩欧美中文字幕一区二区三区| 69堂免费精品视频在线播放| 老牛国内精品亚洲成av人片| 黑森林国产精品av| 最新亚洲激情| 国产欧美在线| 国产aⅴ精品一区二区四区| 1000部精品久久久久久久久| 免费一级片91| 麻豆精品在线| 欧美精品一二| 欧美日韩一区二区国产| 都市激情国产精品| 黄色精品网站| 欧美精品国产白浆久久久久| 精品国产成人| 亚洲综合三区| 国产精品15p| 亚洲一级高清| 日本久久一区| 久久精品亚洲人成影院| 亚洲精品伦理| 色一区二区三区四区| 欧美专区18| 美女精品久久| av不卡在线| 麻豆国产91在线播放| 精品中文字幕一区二区三区av| 亚洲欧洲美洲国产香蕉| 中文在线а√在线8| 日韩综合一区二区| 亚洲天堂一区二区| 欧美亚洲专区| 黄色成人91| 精品不卡一区| 美国欧美日韩国产在线播放| 国产成人免费| 日韩在线网址| 伊人久久大香线蕉av不卡| 欧美亚洲tv| 美女网站一区| 精品国产一区二| 久久午夜视频| 国产不卡一区| 日韩av资源网| 在线亚洲免费| 最新中文字幕在线播放| 欧美日韩国产一区二区在线观看| 亚洲午夜av| 精品高清久久| 青青国产精品| 另类国产ts人妖高潮视频| 国产va在线视频| 国产探花一区| 日韩一区精品视频| 亚洲www免费| 欧美黄色一区| 日韩成人午夜精品| 婷婷成人基地| 福利片在线一区二区| 亚洲欧洲免费| 2023国产精品久久久精品双| 国产一区二区亚洲| 日韩 欧美一区二区三区| 伊人久久婷婷| 久久久一本精品| 国产一区二区三区国产精品| 日本不卡高清| 丝袜国产日韩另类美女| 今天的高清视频免费播放成人| 精品91福利视频| 国产精品一区二区三区美女| 中文字幕日韩亚洲| 欧美a级片一区| 黄色aa久久| 国产一区二区三区网| 日本伊人午夜精品| 蜜桃视频在线观看一区| 国产亚洲福利| 国产视频一区三区| 亚洲电影在线一区二区三区| 久久香蕉国产| 欧美午夜精品一区二区三区电影| 日韩欧美综合| 精品九九在线| 精品高清久久| 高清一区二区| 中文字幕在线看片| 国产成人久久精品麻豆二区| 久久在线91| 国产一区日韩| 成人国产精品久久| 国产在线观看www| 福利精品一区| 波多视频一区| 久久久久国产精品一区三寸 | 久久av在线| 国产美女一区| 一区二区三区国产在线| 一区二区三区网站| 日本综合视频| 欧美一级一区| 日韩高清欧美激情| 国产日韩一区| 欧美成人精品午夜一区二区| 久久99免费视频| 精品国产午夜| 日韩一区二区三区免费播放| 日韩欧美一区二区三区在线观看| 成人va天堂| 国内精品99| 免费国产自线拍一欧美视频| 蜜臀av亚洲一区中文字幕| 亚洲精品乱码| 欧美视频二区| 久久精品国产999大香线蕉| 日韩av有码| 日韩一区欧美| 欧美特黄一级| 亚洲精品伊人| 国产欧美日韩视频在线| 久久久久久久久成人| 极品av在线| 亚洲国产一区二区三区在线播放| 亚洲一级在线| 色综合视频一区二区三区日韩| 久久国际精品| 亚洲精品成人图区| 亚洲免费婷婷| 国产精品一区二区三区www| а√天堂中文在线资源8| 国产韩日影视精品| 亚洲欧洲美洲国产香蕉| 久久久国产精品网站| 久久九九99| 三级欧美在线一区| 国产精品v亚洲精品v日韩精品| 日韩欧美一区二区三区免费看| 亚洲在线国产日韩欧美| 久久国产三级| 99tv成人| 日韩avvvv在线播放| 成人黄色av| 亚洲女人av| 国产极品嫩模在线观看91精品| 久久久久国产| 日韩成人一级| 97精品在线| 模特精品在线| 精品入口麻豆88视频| 国产视频久久| 国产精品极品国产中出| 久久三级福利| 欧美一区成人| 亚洲性视频h| 国产精品羞羞答答在线观看| 亚洲国内精品| 国产欧美69| 免费视频亚洲| 国产精品三p一区二区| 国产一区二区中文| 欧美日韩18| 欧美日韩一二三四| 国产精品免费大片| 午夜国产精品视频| 欧美成人精品午夜一区二区| 亚洲成人三区| 免费在线亚洲欧美| 亚洲一区欧美激情| 国产一区二区三区精品在线观看 | 综合欧美精品| av一区在线| 国产精品久久久久久久免费软件| 欧美日韩国产高清| 国产精品99久久精品| 在线精品视频一区| 日韩不卡在线| 久久99蜜桃| 日韩一区精品|