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

8 篇文章 0 订阅
1 篇文章 0 订阅
本文探讨了如何在Spring整合Netty时确保两者状态同步,通过Spring的事件监听机制,利用ApplicationListener和ApplicationEvent处理上下文事件,如ContextClosedEvent。自定义启动和关闭监听器,并在事件中启动或关闭Netty服务,从而达到同步启动和关闭的效果。实验证实在关闭Spring程序时,Netty服务随之停止,端口释放。
摘要由CSDN通过智能技术生成

本篇介绍如何在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,暂时结束,如有错误的地方,请留言指正哈。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值