成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

180609-Spring之事件驅(qū)動(dòng)機(jī)制的簡(jiǎn)單使用

Hwg / 2645人閱讀

摘要:文章鏈接之事件驅(qū)動(dòng)機(jī)制的簡(jiǎn)單使用之事件驅(qū)動(dòng)機(jī)制的簡(jiǎn)單使用關(guān)于事件的發(fā)起與相應(yīng),在客戶端的交互中可算是非常頻繁的事情了,關(guān)于事件的發(fā)布訂閱,在生態(tài)中,可謂是非常有名了,而也提供了事件機(jī)制,本文則主要介紹后端如何在的環(huán)境中,使用事件機(jī)制使用姿

文章鏈接:https://liuyueyi.github.io/hexblog/hexblog/2018/06/09/180609-Spring之事件驅(qū)動(dòng)機(jī)制的簡(jiǎn)單使用/

Spring之事件驅(qū)動(dòng)機(jī)制的簡(jiǎn)單使用

關(guān)于事件的發(fā)起與相應(yīng),在客戶端的交互中可算是非常頻繁的事情了,關(guān)于事件的發(fā)布訂閱,在Java生態(tài)中,EventBus可謂是非常有名了,而Spring也提供了事件機(jī)制,本文則主要介紹后端如何在Spring的環(huán)境中,使用事件機(jī)制

I. 使用姿勢(shì)

主要借助org.springframework.context.ApplicationEventPublisher#publishEvent(org.springframework.context.ApplicationEvent) 來(lái)發(fā)布事件,而接受方,則直接在處理的方法上,添加 @@EventListener注解即可

1. 事件定義

發(fā)布一個(gè)事件,所以第一件事就是要定義一個(gè)事件,對(duì)Spring而言,要求自定義的事件繼承自ApplicationEvent類, 一個(gè)簡(jiǎn)單的demo如下

public class NotifyEvent extends ApplicationEvent {
    @Getter
    private String msg;

    public NotifyEvent(Object source, String msg) {
        super(source);
        this.msg = msg;
    }
}
2. 發(fā)布事件

發(fā)布時(shí)間則比較簡(jiǎn)單,直接拿到ApplicationContext實(shí)例,執(zhí)行publish方法即可,如下面給出一個(gè)簡(jiǎn)單的發(fā)布類

@Component
public class NotifyPublisher implements ApplicationContextAware {
    private ApplicationContext apc;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.apc = applicationContext;
    }
    
    // 發(fā)布一個(gè)消息
    public void publishEvent(int status, String msg) {
        if (status == 0) {
            apc.publishEvent(new NotifyEvent(this, msg));
        } else {
            apc.publishEvent(new NewNotifyEvent(this, msg, ((int) System.currentTimeMillis() / 1000)));
        }
    }
}
3. 事件監(jiān)聽器

在方法上添加注解即可,如下

@Component
public class NotifyQueueListener {

    @EventListener
    public void consumerA(NotifyEvent notifyEvent) {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("A: " + Thread.currentThread().getName() + " | " + notifyEvent.getMsg());
    }

    @EventListener
    public void consumerB(NewNotifyEvent notifyEvent) {
        System.out.println("B: " + Thread.currentThread().getName() + " | " + notifyEvent.getMsg());
    }


    @EventListener
    public void consumerC(NotifyEvent notifyEvent) {
        System.out.println("C: " + Thread.currentThread().getName() + " | " + notifyEvent.getMsg());
    }
}
II. 疑問(wèn)及解答 1. 發(fā)布與監(jiān)聽器的關(guān)聯(lián)

上面給出了使用的姿勢(shì),看起來(lái)并不復(fù)雜,也比較容易使用,但是一個(gè)問(wèn)題需要在使用之前弄明白了,發(fā)布事件和監(jiān)聽器是怎么關(guān)聯(lián)起來(lái)的呢?

根據(jù)方法的參數(shù)類型執(zhí)行

那么如果發(fā)布者,推送的是一個(gè)NotifyEvent類型的事件,那么接收者是怎樣的呢?

參數(shù)為NotifyEvent以及其子類的監(jiān)聽器,都可以接收到消息

測(cè)試用例如下:

NewNotifyEvent 繼承自上面的NotifyEvent

public class NewNotifyEvent extends NotifyEvent {
    @Getter
    private int version;

    public NewNotifyEvent(Object source, String msg) {
        super(source, msg);
    }
    public NewNotifyEvent(Object source, String msg, int version) {
        super(source, msg);
        this.version = version;
    }
}

然后借助上面的消息發(fā)布者發(fā)送一個(gè)消息

@Test
public void testPublishEvent() throws InterruptedException {
    notifyPublisher.publishEvent(1, "新的發(fā)布事件! NewNotify");
    System.out.println("---------");
    notifyPublisher.publishEvent(0, "舊的發(fā)布事件! Notify");
}

輸出結(jié)果如下,對(duì)于NewNotifyEvent, 參數(shù)類型為NotifyEvent的consumerA, consumerC都可以接收到

A: main | 新的發(fā)布事件! NewNotify
C: main | 新的發(fā)布事件! NewNotify
B: main | 新的發(fā)布事件! NewNotify
---------
A: main | 舊的發(fā)布事件! Notify
C: main | 舊的發(fā)布事件! Notify
2. 消息接收的順序

上面消息處理是串行的,那么先后順序怎么確定? (下面的答案不確定,有待深入源碼驗(yàn)證!?。。?/p>

先掃描到的bean先處理

同一個(gè)bean中,按精確匹配,先后定義順序進(jìn)行

3. 異步消費(fèi)

對(duì)于異步消費(fèi),即在消費(fèi)者方法上添加一個(gè)@Async注解,并需要在配置文件中,開啟異步支持

@Async
@EventListener
public void processNewNotifyEvent(NewNotifyEvent newNotifyEvent) {
    System.out.println("new notifyevent: " + newNotifyEvent.getMsg() + " : " + newNotifyEvent.getVersion());
}

配置支持

@Configuration
@EnableAsync
public class AysncListenerConfig implements AsyncConfigurer {
    /**
     * 獲取異步線程池執(zhí)行對(duì)象
     *
     * @return
     */
    @Override
    public Executor getAsyncExecutor() {
        return new ThreadPoolExecutor(5, 10, 1, TimeUnit.MINUTES, new LinkedBlockingQueue(),
                new DefaultThreadFactory("test"), new ThreadPoolExecutor.CallerRunsPolicy());
    }
}
III. 其他 一灰灰Blog: https://liuyueyi.github.io/he...

一灰灰的個(gè)人博客,記錄所有學(xué)習(xí)和工作中的博文,歡迎大家前去逛逛

聲明

盡信書則不如,已上內(nèi)容,純屬一家之言,因個(gè)人能力有限,難免有疏漏和錯(cuò)誤之處,如發(fā)現(xiàn)bug或者有更好的建議,歡迎批評(píng)指正,不吝感激

微博地址: 小灰灰Blog

QQ: 一灰灰/3302797840

掃描關(guān)注

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/69711.html

相關(guān)文章

  • 初窺JavaScript事件機(jī)制實(shí)現(xiàn)(一)—— Node.js事件驅(qū)動(dòng)實(shí)現(xiàn)概覽

    摘要:如果當(dāng)前沒(méi)有事件也沒(méi)有定時(shí)器事件,則返回。相關(guān)資料關(guān)于的架構(gòu)及設(shè)計(jì)思路的事件討論了使用線程池異步運(yùn)行代碼。下一篇初窺事件機(jī)制的實(shí)現(xiàn)二中定時(shí)器的實(shí)現(xiàn) 在瀏覽器中,事件作為一個(gè)極為重要的機(jī)制,給予JavaScript響應(yīng)用戶操作與DOM變化的能力;在Node.js中,事件驅(qū)動(dòng)模型則是其高并發(fā)能力的基礎(chǔ)。 學(xué)習(xí)JavaScript也需要了解它的運(yùn)行平臺(tái),為了更好的理解JavaScript的事...

    lavor 評(píng)論0 收藏0
  • Nodejs高性能原理(上) --- 異步非阻塞事件驅(qū)動(dòng)模型

    摘要:使用了一個(gè)事件驅(qū)動(dòng)非阻塞式的模型,使其輕量又高效。的包管理器,是全球最大的開源庫(kù)生態(tài)系統(tǒng)。按照這個(gè)定義,之前所述的阻塞,非阻塞,多路復(fù)用信號(hào)驅(qū)動(dòng)都屬于同步。 系列文章 Nodejs高性能原理(上) --- 異步非阻塞事件驅(qū)動(dòng)模型Nodejs高性能原理(下) --- 事件循環(huán)詳解 前言 終于開始我nodejs的博客生涯了,先從基本的原理講起.以前寫過(guò)一篇瀏覽器執(zhí)行機(jī)制的文章,和nodej...

    yy736044583 評(píng)論0 收藏0
  • Netty源碼解析

    摘要:一旦某個(gè)事件觸發(fā),相應(yīng)的則會(huì)被調(diào)用,并進(jìn)行處理。事實(shí)上,內(nèi)部的連接處理協(xié)議編解碼超時(shí)等機(jī)制,都是通過(guò)完成的。開啟源碼之門理解了的事件驅(qū)動(dòng)機(jī)制,我們現(xiàn)在可以來(lái)研究的各個(gè)模塊了。 Netty是什么 大概用Netty的,無(wú)論新手還是老手,都知道它是一個(gè)網(wǎng)絡(luò)通訊框架。所謂框架,基本上都是一個(gè)作用:基于底層API,提供更便捷的編程模型。那么通訊框架到底做了什么事情呢?回答這個(gè)問(wèn)題并不太容易,我們...

    _Suqin 評(píng)論0 收藏0
  • 架構(gòu)師必收藏干貨?。?!

    摘要:一微服務(wù)概念微服務(wù)體系結(jié)構(gòu)由輕量級(jí)松散耦合的服務(wù)集合組成。每個(gè)服務(wù)都有自己的計(jì)劃測(cè)試發(fā)布部署擴(kuò)展集成和獨(dú)立維護(hù)。團(tuán)隊(duì)不必因?yàn)檫^(guò)去的技術(shù)決定而受到懲罰。用在這里是指將相關(guān)的服務(wù)通過(guò)聚合器聚合在一起,這個(gè)聚合器就是門面。 微服務(wù)架構(gòu)現(xiàn)在是談到企業(yè)應(yīng)用架構(gòu)時(shí)必聊的話題,微服務(wù)之所以火熱也是因?yàn)橄鄬?duì)之前的應(yīng)用開發(fā)方式有很多優(yōu)點(diǎn),如更靈活、更能適應(yīng)現(xiàn)在需求快速變更的大環(huán)境。 一、微服務(wù)概念 微服...

    shiweifu 評(píng)論0 收藏0
  • vue總結(jié)系列--數(shù)據(jù)驅(qū)動(dòng)和響應(yīng)式

    摘要:由于是需要兼容的后臺(tái)系統(tǒng),該項(xiàng)目并不能使用到等技術(shù),因此我在上的經(jīng)驗(yàn)大都是使用原生的編寫的,可以看見一個(gè)組件分為兩部分視圖部分,和數(shù)據(jù)部分。 在公司里幫項(xiàng)目組里開發(fā)后臺(tái)系統(tǒng)的前端項(xiàng)目也有一段時(shí)間了。 vue這種數(shù)據(jù)驅(qū)動(dòng),組件化的框架和react很像,從一開始的快速上手基本的開發(fā),到后來(lái)開始自定義組件,對(duì)element UI的組件二次封裝以滿足項(xiàng)目需求,期間也是踩了不少坑。由于將來(lái)很長(zhǎng)一...

    AbnerMing 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<