spring容器事件与netty服务状态一致的设计思路与实践

本篇介绍如何在spring整合netty框架的时候如何将spring容器的启动关闭刷新事件等和netty服务进行绑定,让其状态同步,即同时启动,同时关闭。

以springboot框架为例

首先我们知道在spring中几种事件类型,在spring的时间监听容器中,由接口ApplicationListener来处理。
直接分析源码

public interface ApplicationListener extends EventListener {

由此可见,其继承了ApplicationEvent类和接口EventListener

spring容器事件与netty服务状态一致的设计思路与实践_第1张图片

spring定义了如下几种类型的上下文事件
spring容器事件与netty服务状态一致的设计思路与实践_第2张图片

取其中的一个:ContextClosedEvent进去分析源码

spring容器事件与netty服务状态一致的设计思路与实践_第3张图片
哈哈,你没有看错,就一个方法。然而神奇的地方就在这里,这是设计模式中的策略模式。
点击进入其实现:
spring容器事件与netty服务状态一致的设计思路与实践_第4张图片
在抽象类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() {
            @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 {

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

使用 application.addListeners(new IoTApplicatonStartEventListener());进行注册,这样,就可以定义好启动时间监听器了。

好了,道理讲明白了,那么我们只需要再定义一个容器关闭的自定义监听器就可以了。

public class IoTApplicatonCloseEventListener implements ApplicationListener {

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

和启动事件一样的注册即可。想要做什么事可以在onApplicationEvent方法中处理就i行了。

回到开始的话题,我们是要让netty服务和spring容器状态一直,那么,在启动监听器和关闭监听器里面直接启动和关闭netty服务就行啦。

运行效果:
spring容器事件与netty服务状态一致的设计思路与实践_第5张图片
spring容器事件与netty服务状态一致的设计思路与实践_第6张图片
直接关闭我们的spring程序
spring容器事件与netty服务状态一致的设计思路与实践_第7张图片
直接可以看到netty服务已经停止,绑定的端口8001也已经释放。
ok,暂时结束,如有错误的地方,请留言指正哈。

你可能感兴趣的:(架构,Springboot,Netty)