文档章节

springboot dubbo logback shutdownhook简单总结

o
 osc_g8254g7s
发布于 2019/08/19 17:07
字数 507
阅读 0
收藏 0

精选30+云产品,助力企业轻松上云!>>>

 
public class Test {
    public static void main(String[] args){
        System.out.println("1: Main start");

        Thread mainThread = Thread.currentThread();

        //注册一个 ShutdownHook
        ShutdownSampleHook thread=new ShutdownSampleHook(mainThread);
        Runtime.getRuntime().addShutdownHook(thread);

        try {
            Thread.sleep(30*1000);
        } catch (InterruptedException e) {
            System.out.println("3: mainThread get interrupt signal.");
        }

        System.out.println("4: Main end");  
    }
}

class ShutdownSampleHook extends Thread {
    private Thread mainThread;
    @Override
    public void run() {
        System.out.println("2: Shut down signal received.");
        mainThread.interrupt();//给主线程发送一个中断信号
        try {
            mainThread.join(); //等待 mainThread 正常运行完毕
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("5: Shut down complete.");
    }

    public ShutdownSampleHook(Thread mainThread) {
        this.mainThread=mainThread;

    }
}

 

关于 mainThread.interrupt() 方法的说明, 该方法将给主线程发送一个中断信号. 如果主线程没有进入阻塞状态, interrupt() 其实没有什么作用; 如果主线程处于阻塞状态, 该线程将得到一个 InterruptedException 异常. 在调用 mainThread.join() 或 mainThread.wait() 之前, 仍可以通过调用 mainThread.interrupted() 来清除中断信号. 
一个线程有三种进入阻塞状态的方法, 分别是调用 Thread.wait() 或 Thread.join() 或 Thread.sleep().

 

正常情况下, 程序需要运行 30 秒, 程序的输出是:

 

如果在程序启动后, 按下 Ctrl+C, 程序很快就结束了, 最终的输出是:

 

   spring的shutdownhook是在AbstractApplicationContext.registerShutdownhook方法内,可以通过springapplication的set方法取消这个钩子。createApplicationContext这个方法内部通过反射,构建了ConfigurableApplicationContext的实例,是AbstractApplicationContext的子类,因此会调用到AbstractApplicationContext.registerShutdownhook方法。

  dubbo在AbstractConfig的静态代码块添加了一个钩子,钩子内部调用了ProtocolConfig的destroyAll静态方法,所以无法关闭钩子,也无法通过继承等方式在这个流程去控制钩子。
唯一可能可以的方式是通过继承dubboProtocol类,实现dubboProtocol类的destory方法,更改服务注册以及关闭的逻辑,然后在ProtocolConfig类中指定协议为这个继承类。由于太麻
烦而且也不是很合理所以没有继续实践了。
关于dubbo关闭钩子的解决方案,下面这个链接有简单介绍,思路是直接更改shutdownhook的map,将dubbo的shutdownhook过滤掉
https://blog.csdn.net/wins22237/article/details/72758644/
o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

物联网开发服务开发虚拟设备需要几步?

云栖号快速入门:【点击查看更多云产品快速入门】 不知道怎么入门?这里分分钟解决新手入门等基础问题,可快速完成产品配置操作! 物联网平台设备的正常开发流程是:设备端开发完成,设备上报...

osc_2axit9df
52分钟前
18
0
互联网互联网必看文章墙裂推荐

后端必看文章系列 大型项目架构演进过程及思考的点

code-ortaerc
52分钟前
20
0
ACL2020论文整理 - 知乎

ACL2020录取文章已经放出,链接如下: ACL2020论文集合 www.aclweb.org 为了以后更加方便地阅读论文,也本着一颗开源之心,花一个下午的时间整理了一下相关论文。鉴于本人精力有限,并且也只...

osc_5w65ebjo
53分钟前
10
0
SU(N) Hubbard 模型平均场

osc_31d5oo2i
55分钟前
18
0
Python语言及其应用PDF高清完整版百度云盘免费下载|python基础教程PDF电子书推荐

编辑推荐 本书内容易于理解,而且读起来生动有趣,是编程和Python初学者不可多得的教程。书中首先介绍了Python的基础知识,然后逐渐深入多种主题,结合教程和攻略式风格来讲解Python 3中的概...

osc_nbg2lo7i
55分钟前
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部