欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Guava中EventBus的使用

 更新時(shí)間:2022年12月23日 09:50:43   作者:指北君  
EventBus是Guava的事件處理機(jī)制,是設(shè)計(jì)模式中觀察者模式(生產(chǎn)/消費(fèi)者編程模型)的優(yōu)雅實(shí)現(xiàn)。本文就來(lái)和大家聊聊EventBus的使用,需要的可以參考一下

Guava EventBus

EventBus是Guava的事件處理機(jī)制,是設(shè)計(jì)模式中觀察者模式(生產(chǎn)/消費(fèi)者編程模型)的優(yōu)雅實(shí)現(xiàn)。對(duì)于事件監(jiān)聽(tīng)和發(fā)布訂閱模式,EventBus使用非常簡(jiǎn)單便捷。

如果你做過(guò)CS的開(kāi)發(fā),下面這段代碼可能會(huì)比較熟悉。

Button?button?=?new?Button("確定");

button.addListener(?new?Listener(){
????...
????public?void?onClick(Event?event){
????????//?
????}
????...
}?);

為按鈕注冊(cè)事件監(jiān)聽(tīng),當(dāng)按鈕被點(diǎn)擊時(shí),則觸發(fā)監(jiān)聽(tīng)中相應(yīng)的回調(diào)。在上面的代碼中,有三個(gè)角色事件(Event),事件源(Button),監(jiān)聽(tīng)(Listener),按鈕作為事件源,當(dāng)點(diǎn)擊行為觸發(fā)時(shí),會(huì)將該行為封裝成對(duì)應(yīng)的點(diǎn)擊事件,并根據(jù)行為類型將事件傳遞到響應(yīng)的監(jiān)聽(tīng)器上, 這也就是我們常說(shuō)的監(jiān)聽(tīng)器模式。

使用場(chǎng)景

實(shí)現(xiàn)消息生產(chǎn)者與消費(fèi)者間的解耦,對(duì)應(yīng)事件源與監(jiān)聽(tīng)器,而消息則是事件

通過(guò)事件驅(qū)動(dòng)業(yè)務(wù)流程扭轉(zhuǎn),通過(guò)異步執(zhí)行機(jī)制實(shí)現(xiàn)代碼非阻塞執(zhí)行

擴(kuò)展主線外的分支業(yè)務(wù),減少代碼的侵入,比如各個(gè)環(huán)節(jié)的消息通知、短信提醒等

實(shí)現(xiàn)消息廣播到不同的模塊中

示例

訂單支付時(shí)的消息發(fā)送

//?商品
public?class?ProductOrder?{
????private?String?user;?//?用戶
????private?String?product;?//?商品
????private?double?amount;?//?金額
????@Override
????public?String?toString()?{
????????return?String.format("用戶:%s購(gòu)買(mǎi)了商品:%s,總金額:%s",?user,?product,?amount);
????}
}
//?事件
????@Data
????@AllArgsConstructor
????public?static?class?CreateOrderEvent?implements?OrderEvent{
????????private?ProductOrder?order;
????}
//?監(jiān)聽(tīng)
????public?static?class?CreateOrderListener{
????????@Subscribe
????????public?void?onEvent(CreateOrderEvent?event)?{
????????????log.info("創(chuàng)建訂單:{}",?event.getOrder());
????????}
????}

測(cè)試: 我們可以定義各種事件,比如訂單創(chuàng)建、訂單取消、訂單支付... 只需要簡(jiǎn)單的三個(gè)步驟即可:

//?1.?創(chuàng)建事件總線
????EventBus?eventBus?=?new?EventBus(?ProductOrder.class.getName()?);
//?2.?注冊(cè)事件監(jiān)聽(tīng)
????eventBus.register(?new?CreateOrderListener()?);
????eventBus.register(?new?PayOrderListener()?);
????eventBus.register(?new?CancelOrderListener()?);
????eventBus.register(?new?RenewOrderListener()?);
//?3.?發(fā)送事件通知
????eventBus.post(new?ProductOrder.CreateOrderEvent(order));
????TimeUnit.SECONDS.sleep(1);
????eventBus.post(new?ProductOrder.CancelOrderEvent(order));
????TimeUnit.SECONDS.sleep(1);
????eventBus.post(new?ProductOrder.RenewOrderEvent(order));
????TimeUnit.SECONDS.sleep(1);
????eventBus.post(new?ProductOrder.PayOrderEvent(order));
????TimeUnit.SECONDS.sleep(5);
????eventBus.post(new?ProductOrder.ReturnOrderEvent(order));

同時(shí)我們可以通過(guò)AsyncEventBus建立事件異步總線,這樣在事件被觸發(fā)時(shí),可以異步通知監(jiān)聽(tīng)者完成事件回調(diào),以此來(lái)提高響應(yīng)速度。

核心

EventBus

事件總線,可以理解為事件與監(jiān)聽(tīng)器的上下文,主要實(shí)現(xiàn)事件的注冊(cè)、事件的分發(fā)、以及監(jiān)聽(tīng)器的回調(diào),主要提供的方法包括:

  • register 注冊(cè)監(jiān)聽(tīng),將監(jiān)聽(tīng)器注冊(cè)到事件總線,通過(guò)注解@Subscribe通知其監(jiān)聽(tīng)的事件類型(第一個(gè)方法參數(shù)類型)
  • unregister 卸載監(jiān)聽(tīng),從事件總線移除監(jiān)聽(tīng)
  • post 發(fā)送事件通知,根據(jù)post事件類型,找到所有訂閱了該類型事件的監(jiān)聽(tīng)器,并將事件推送到監(jiān)聽(tīng)器對(duì)應(yīng)的監(jiān)聽(tīng)方法

Subscribe

通過(guò)@Subscribe標(biāo)識(shí)監(jiān)聽(tīng)器所關(guān)注的事件類型

Event

可以是任何對(duì)象,當(dāng)然不建議將基礎(chǔ)類型或String作為事件類型,這樣就沒(méi)法做到按類型區(qū)分了

通過(guò)上面的圖就可以很清楚各個(gè)各個(gè)組件的職責(zé),以及如何通過(guò)事件總線完成事件向監(jiān)聽(tīng)的傳播,最終基于事件回調(diào)機(jī)制完成消息傳遞?;谑录?qū)動(dòng)的服務(wù)模型

上面這種結(jié)構(gòu)的圖形是不是在很多位置都見(jiàn)過(guò),這是一種經(jīng)典的設(shè)計(jì)模式。試想一下,我們不通過(guò)事件驅(qū)動(dòng)行為時(shí),一般你們?cè)趺磳?xiě)代碼,通過(guò)ifelse?或者其他有著異曲同工的 實(shí)現(xiàn)方法,目的最后都是一樣?;贕uava提供的工具,我們不僅在使用時(shí)只需要簡(jiǎn)單的三個(gè)步驟就能實(shí)現(xiàn),同樣,當(dāng)需要屏蔽該功能時(shí)只需要去掉register一行即可,對(duì)整體功能 也沒(méi)有任何的影響。

在我們引入某種設(shè)計(jì)模式,某種架構(gòu)模型時(shí),總的目的都是為了降低代碼模塊間的耦合度,提升代碼整體的可讀性,最終讓代碼能夠易于維護(hù)性,或者有一定的復(fù)用性。

總結(jié)

事件監(jiān)聽(tīng)模式、觀察者模式、發(fā)布訂閱模式,都是非常的相似,通過(guò)建立事件與監(jiān)聽(tīng)器、觀察者與被觀察者、生產(chǎn)者與消費(fèi)者者間消息傳遞媒介(示例中的事件總線EventBus),

不僅能夠使消息的發(fā)起者與接收者之間進(jìn)行解耦,最主要的是通過(guò)消息傳遞渠道實(shí)現(xiàn)消息異步傳播,提升系統(tǒng)效率

到此這篇關(guān)于詳解Guava中EventBus的使用的文章就介紹到這了,更多相關(guān)Guava EventBus內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • IDEA使用Gradle構(gòu)建SpringBoot項(xiàng)目工程的詳細(xì)教程

    IDEA使用Gradle構(gòu)建SpringBoot項(xiàng)目工程的詳細(xì)教程

    這篇文章主要介紹了IDEA使用Gradle構(gòu)建SpringBoot項(xiàng)目工程的教程詳解,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • SpringBoot超詳細(xì)講解集成Flink的部署與打包方法

    SpringBoot超詳細(xì)講解集成Flink的部署與打包方法

    昨天折騰了下SpringBoot與Flink集成,實(shí)際上集成特簡(jiǎn)單,主要是部署打包的問(wèn)題折騰了不少時(shí)間。想打出的包直接可以java -jar運(yùn)行,同時(shí)也可以flink run運(yùn)行,或者在flink的dashboard上上傳點(diǎn)擊啟動(dòng)。結(jié)果是不行,但是使用不同的插件打包還是可以的
    2022-05-05
  • Java在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置的方法詳解

    Java在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置的方法詳解

    相信大家在操作Java的時(shí)候經(jīng)常會(huì)要在一個(gè)數(shù)組(無(wú)序)中查找元素的第一個(gè)和最后一個(gè)位置,下面這篇文章主要給大家介紹了關(guān)于Java在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之字符串暴力匹配

    Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之字符串暴力匹配

    字符串暴力匹配算法是指在一個(gè)長(zhǎng)字符串中暴力尋找是否包含某一子串所謂暴力匹配,就是不使用任何其他算法,將兩個(gè)字符串中的字符一一進(jìn)行比對(duì)
    2022-02-02
  • xxl-job定時(shí)任務(wù)配置應(yīng)用及添加到springboot項(xiàng)目中實(shí)現(xiàn)動(dòng)態(tài)API調(diào)用

    xxl-job定時(shí)任務(wù)配置應(yīng)用及添加到springboot項(xiàng)目中實(shí)現(xiàn)動(dòng)態(tài)API調(diào)用

    XXL-JOB是一個(gè)分布式任務(wù)調(diào)度平臺(tái),其核心設(shè)計(jì)目標(biāo)是開(kāi)發(fā)迅速、學(xué)習(xí)簡(jiǎn)單、輕量級(jí)、易擴(kuò)展,本篇文章主要是對(duì)xuxueli的xxl-job做一個(gè)簡(jiǎn)單的配置,以及將其添加到自己已有的項(xiàng)目中進(jìn)行api調(diào)用,感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • Java  解決死鎖的方法實(shí)例詳解

    Java 解決死鎖的方法實(shí)例詳解

    這篇文章主要介紹了java 多線程死鎖詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Spring Boot @Async 異步任務(wù)執(zhí)行方法

    Spring Boot @Async 異步任務(wù)執(zhí)行方法

    本篇文章主要介紹了Spring Boot @Async 異步任務(wù)執(zhí)行方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • Spring?Cloud?Alibaba實(shí)現(xiàn)服務(wù)的無(wú)損下線功能(案例講解)

    Spring?Cloud?Alibaba實(shí)現(xiàn)服務(wù)的無(wú)損下線功能(案例講解)

    這篇文章主要介紹了Spring?Cloud?Alibaba實(shí)現(xiàn)服務(wù)的無(wú)損下線功能?,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • SpringBoot解析yml全流程詳解

    SpringBoot解析yml全流程詳解

    本文主要介紹了SpringBoot解析yml全流程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • SpringBoot整合Swagger接口文檔工具的流程步驟

    SpringBoot整合Swagger接口文檔工具的流程步驟

    我們?cè)陂_(kāi)發(fā)接口的時(shí)候,會(huì)將接口文檔給前端的開(kāi)發(fā)者進(jìn)行對(duì)接,我們可以通過(guò)Postman或者Yapi等接口管理工具進(jìn)行編寫(xiě)管理,實(shí)際開(kāi)發(fā)中,接口的管理確實(shí)也應(yīng)該通過(guò)專業(yè)的工具管理,本文,我們就來(lái)談?wù)勗趺丛赟pringBoot整合Swagger接口文檔工具
    2023-08-08

最新評(píng)論