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

您的位置:首頁技術文章
文章詳情頁

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

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

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

觀察者模式在我們日常開發中使用非常廣泛,例如在訂單系統中,訂單狀態或者物流信息的變更會向用戶發送APP推送、短信、通知賣家、買家等等;審批系統中,審批單的流程流轉會通知發起審批用戶、審批的領導等等。

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

一、為什么要用 Observer模式以及 EventBus 優點 ?

EventBus 優點

相比 Observer 編程簡單方便 通過自定義參數可實現同步、異步操作以及異常處理 單進程使用,無網絡影響

缺點

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

如果需要分布式使用還是需要使用 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 來進行注冊訂閱、取消訂閱和發布消息

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

1. 首先創建一個 EventBus

EventBus eventBus = new EventBus();

2. 創建一個訂閱者

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

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

3. 注冊到 EventBus 上并發布消息

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

運行結果為

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

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

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

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

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. 異步使用

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

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

這樣即可實現異步使用

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. 異常處理

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

其接口聲明為

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

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

參考

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

以上就是JAVA | Guava EventBus 使用 發布/訂閱模式的步驟的詳細內容,更多關于Guava EventBus 使用 發布/訂閱模式的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
99在线|亚洲一区二区| 国产理论在线| 日韩电影免费在线观看| 日本免费新一区视频| 丝袜美腿亚洲一区| 黄色国产精品| 91精品蜜臀一区二区三区在线| 国产精品一区二区三区四区在线观看 | 国产精品一区二区三区av| 日韩欧美精品一区| 亚洲专区视频| 69精品国产久热在线观看| 福利一区二区三区视频在线观看| 久久国产精品成人免费观看的软件| 99久久精品国产亚洲精品| 国产韩日影视精品| 日韩国产欧美一区二区三区| 成人午夜在线| 一区二区自拍| 免费在线视频一区| 国产探花一区二区| 天堂资源在线亚洲| 婷婷成人在线| 国产精品国码视频| 神马午夜久久| 日本亚洲最大的色成网站www | 久久精品观看| 亚洲精品国产嫩草在线观看 | 亚洲精品乱码久久久久久蜜桃麻豆| 国产一区二区亚洲| 欧美xxxx中国| 久久狠狠婷婷| 中文字幕av一区二区三区四区| 六月婷婷一区| 欧美日韩在线精品一区二区三区激情综合| 婷婷五月色综合香五月| 国产精品hd| 999精品一区| 青青伊人久久| 黄色亚洲大片免费在线观看| 激情中国色综合| 亚洲成人av观看| 黄色亚洲大片免费在线观看| 中文亚洲免费| 亚洲毛片网站| 高清一区二区三区av| 1024精品一区二区三区| 91日韩欧美| 国产亚洲一区二区手机在线观看| 国产专区一区| 亚洲资源网站| 免费高潮视频95在线观看网站| 久久亚洲二区| 国产精品av久久久久久麻豆网| 麻豆久久久久久| 欧美色图一区| 久久av超碰| 国产成人免费精品| 国产精品一区亚洲| 黄色成人在线网址| 色综合视频一区二区三区日韩| 国产麻豆精品久久| 99精品电影| 岛国av在线播放| 国产精品一页| 欧美日韩视频免费看| 国产视频一区二| 日本一二区不卡| 视频精品一区| 欧美一级鲁丝片| 欧美成人a交片免费看| 日韩精品一区二区三区中文| 99久久久久| 亚洲激情国产| 天堂а√在线最新版中文在线| 国产美女视频一区二区| 美日韩一区二区三区| 国产精品1区| 久久激情一区| 在线一区av| 日本 国产 欧美色综合| 婷婷综合电影| 国产精品欧美大片| 精品三级av| 美女被久久久| 日韩欧美高清一区二区三区| 精品视频免费| 91精品观看| 精品久久久网| 精品一区二区三区的国产在线观看 | 日本成人中文字幕在线视频| 免费亚洲一区| 久久免费黄色| 亚洲精品伊人| 91精品国产自产观看在线| 97久久精品| 日韩欧美中文字幕电影| 天堂久久一区| 西西人体一区二区| 精品国产a一区二区三区v免费| 亚洲va久久| 欧美一区二区三区激情视频| av中文资源在线资源免费观看| 亚洲精品第一| 国产乱人伦精品一区| 热久久国产精品| 日韩中文字幕高清在线观看| 久久高清国产| 欧美特黄一级| 97精品在线| 国产一区二区三区四区五区| 日本一区二区三区中文字幕| 免费在线观看一区二区三区| 精品三级久久| 日本不卡不码高清免费观看| 国产精品视区| 黑丝一区二区三区| 欧美日韩色图| 免费久久99精品国产自在现线| 夜夜嗨av一区二区三区网站四季av| 欧美一级久久| 极品日韩av| 国产乱人伦丫前精品视频| aⅴ色国产欧美| 一本一道久久a久久精品蜜桃| 日韩av网站在线观看| 久久毛片亚洲| 久久婷婷国产| 三级在线观看一区二区 | 久久久久伊人| 国产精品乱战久久久| 91亚洲无吗| 国产精品久久国产愉拍| 婷婷成人在线| 精品日产乱码久久久久久仙踪林| 免费视频一区二区| 欧美专区在线| 在线亚洲自拍| 久久亚洲专区| 尤物精品在线| 欧美 日韩 国产精品免费观看| 欧美中文字幕一区二区| 亚洲精品成人图区| 日韩免费在线| 日韩大片在线观看| 色在线中文字幕| 欧洲毛片在线视频免费观看| 88xx成人免费观看视频库| 久久婷婷久久| 蜜臀久久99精品久久一区二区 | 日韩av在线播放网址| 精品国产美女a久久9999| 国产精品欧美一区二区三区不卡| 麻豆高清免费国产一区| 国内精品亚洲| 日韩在线观看一区| 日韩av电影一区| 国产伦理一区| 国产一区二区三区四区二区| 久久av资源| 亚洲一区有码| 国产精品丝袜在线播放| 婷婷综合亚洲| 亚洲国产福利| 丝袜美腿一区| 欧美+日本+国产+在线a∨观看| 国产精品久久久久久久免费观看 | 亚洲精一区二区三区| 日韩.com| 四虎成人精品一区二区免费网站| 精品国产乱码久久久久久1区2匹 | 欧产日产国产精品视频| 超碰超碰人人人人精品| 国内精品福利| 日韩高清欧美| 欧美国产免费| 国产精品亚洲一区二区在线观看 | 亚洲免费激情| 久久久蜜桃一区二区人| 亚洲va在线| 国产亚洲午夜| 欧美国产专区| 日韩毛片视频| 亚洲精品伊人| 精品国内亚洲2022精品成人| 中文一区一区三区免费在线观 | 超碰在线99| 婷婷综合国产| 日韩精品一级| 亚洲综合精品四区| 欧美激情aⅴ一区二区三区| 欧美精品不卡| 97精品97| 日韩亚洲一区在线| 欧美日韩激情| 亚洲在线电影| 日韩中文字幕无砖| 国产精品毛片aⅴ一区二区三区| 午夜精品影视国产一区在线麻豆| 欧美天堂在线|