spring容器事件與netty服務狀態一致的設計思路與實踐

本篇介紹如何在spring整合netty框架的時候如何將spring容器的啓動關閉刷新事件等和netty服務進行綁定,讓其狀態同步,即同時啓動,同時關閉。

以springboot框架爲例

首先我們知道在spring中幾種事件類型,在spring的時間監聽容器中,由接口ApplicationListener來處理。
直接分析源碼

public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {

由此可見,其繼承了ApplicationEvent類和接口EventListener

在這裏插入圖片描述

spring定義瞭如下幾種類型的上下文事件
在這裏插入圖片描述

取其中的一個:ContextClosedEvent進去分析源碼

在這裏插入圖片描述
哈哈,你沒有看錯,就一個方法。然而神奇的地方就在這裏,這是設計模式中的策略模式。
點擊進入其實現:
在這裏插入圖片描述
在抽象類AbstractApplicationContext中的doClose方法中引用。

AbstractApplicationContext最終是要被SpringApplication來繼承的。

所以,回到開始,你定義的Application.java已經繼承了AbstractApplicationContext,所有的事件都已經實現好了,只需要你使用就行了。
使用肯定是要先註冊監聽器,這是觀察者模式的應用。

/**
 * @author Ligang.Wang[[email protected]]
 */
@SpringBootApplication
public class WebiotApplication {
    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(WebiotApplication.class);

        application.addListeners(new ApplicationListener<ApplicationStartedEvent>() {
            @Override
            public void onApplicationEvent(ApplicationStartedEvent event) {
                //do some thing
            }
        });

        // application.addListeners(new IoTApplicatonStartEventListener());
        // application.addListeners(new IoTApplicatonCloseEventListener());
        application.run(args);

    }

那麼,我們爲了方便代碼維護和自己定義業務可以自定義一個監聽器,如下:

/**
 * @author : Ligang.Wang[[email protected]]
 * @date : 2019/3/21
 */
public class IoTApplicatonStartEventListener implements ApplicationListener<ApplicationStartedEvent> {

    @Override
    public void onApplicationEvent(ApplicationStartedEvent event) {
        System.out.println("Spring start successful");
    }
}

使用 application.addListeners(new IoTApplicatonStartEventListener());進行註冊,這樣,就可以定義好啓動時間監聽器了。

好了,道理講明白了,那麼我們只需要再定義一個容器關閉的自定義監聽器就可以了。

public class IoTApplicatonCloseEventListener implements ApplicationListener<ContextClosedEvent> {

    @Override
    public void onApplicationEvent(ContextClosedEvent event) {
        System.out.println("spring IOC is closed");
    }
}

和啓動事件一樣的註冊即可。想要做什麼事可以在onApplicationEvent方法中處理就i行了。

回到開始的話題,我們是要讓netty服務和spring容器狀態一直,那麼,在啓動監聽器和關閉監聽器裏面直接啓動和關閉netty服務就行啦。

運行效果:
在這裏插入圖片描述
在這裏插入圖片描述
直接關閉我們的spring程序
在這裏插入圖片描述
直接可以看到netty服務已經停止,綁定的端口8001也已經釋放。
ok,暫時結束,如有錯誤的地方,請留言指正哈。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章