本篇介绍如何在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[wlgchun@163.com]
*/
@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[wangligang@karaku.cn]
* @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,暂时结束,如有错误的地方,请留言指正哈。