本篇介紹如何在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,暫時結束,如有錯誤的地方,請留言指正哈。