首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ShutdownHook原理

ShutdownHook介绍 在java程序中,很容易在进程结束时添加一个钩子,即ShutdownHook。...ShutdownHook的能力,如dubbo、spring等。...ShutdownHook原理 ShutdownHook的数据结构与执行顺序 当我们添加一个ShutdownHook时,会调用ApplicationShutdownHooks.add(hook),往ApplicationShutdownHooks...,并且系统级的ShutdownHook由一个数组构成,只能添加10个 系统级的ShutdownHook调用了thread类的run方法,所以系统级的ShutdownHook是同步有序执行的 private...总结 综上,我们得出一些结论 重写捕获信号需要注意主动退出进程,否则进程可能永远不会退出,捕获信号的执行是异步的 用户级的ShutdownHook是绑定在系统级的ShutdownHook之上,且用户级是异步执行

61641
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    ShutdownHook妙用

    上期文章分享了ShutdownHook的API和基本使用,但是少了一些实际工作中的案例,总感觉没啥大用一样。 最近总结工作中可以用到ShutdownHook来解决一些实际问题的例子,分享给大家。...如果你想使用一种优雅的方法完成这个任务的话,那么ShutdownHook绝对是不二选择。...static { Runtime.getRuntime().addShutdownHook(new Thread(() -> closeScanner())); } 释放连接 ShutdownHook...PS:到这里,当我们需要添加超过1个ShutdownHook的时候,就可以非常明显地感受到daemon线程实现方案的差异,因为ShutdownHook可以到处写,多点开花。...一旦遇到异常,ShutdownHook中的方法会把已经创建好的用户ID存在文件中。每次执行,已创建好的用户ID集合会从文件中进行初始化。

    12730

    ShutdownHook - Java 优雅停机解决方案

    ps: 仔细品味,优雅停机这个词真好~ ShutdownHook# Java 语言提供一种 ShutdownHook(钩子)进制,当 JVM 接受到系统的关闭通知之后,调用 ShutdownHook 内的方法...但是需要注意的是,多个 ShutdownHook 之间并无任何顺序,Java 并不会按照加入顺序执行,反而将会并发执行。 所以尽量在一个 ShutdownHook 完成所有操作。...ShutdownHook 需要尽快执行结束 不要在 ShutdownHook 执行需要被阻塞代码,如 I/0 读写,这样就会导致应用短时间不能被关闭。...为了避免 ShutdownHook 线程被长时间阻塞,我们可以引入超时进制。...如果等待一定时间之后,ShutdownHook 还未完成,由脚本直接调用 kill -9 强制退出或者 ShutdownHook 代码中引入超时进制。

    98120

    Java - 探究Java优雅退出的两种机制

    步骤 注册ShutdownHook: 在Java中,可以通过Runtime类的addShutdownHook(Thread hook)方法来注册ShutdownHook。...: 注册的ShutdownHook会按照注册的顺序依次执行。...但是不能保证所有的ShutdownHook都会被执行,因为在某些情况下,比如JVM崩溃,kill -9可能无法正常执行ShutdownHook。...注意事项 使用Java的ShutdownHook(注册在JVM层面的钩子)进行应用的优雅退出时,有几个重要的注意事项: ShutdownHook的执行不确定性:ShutdownHook并非在所有情况下都会被...ShutdownHook的执行顺序:JVM不保证ShutdownHook的执行顺序,如果在一个应用中注册了多个ShutdownHook,它们可能不会按照添加的顺序执行,因此不应该在ShutdownHook

    21900

    拒绝 kill -9, SpringBoot 优雅停机详解!文末赠书!

    关闭命令方面,一定要杜绝 kill -9 操作 多线程采用线程池实现,保证每个异步线程都可以随Spring的生命周期完成正常关闭操作 有服务注册与发现机制下的时候,通过Spring的应用关闭事件、Java应用的ShutdownHook...优雅停机或者一些后置处理可参考以下源码) //ApplicationContext @Override public void registerShutdownHook() { if (this.shutdownHook...this.shutdownHook = new Thread(SHUTDOWN_HOOK_THREAD_NAME) { @Override public void run() {...); } } kill -9,暴力美学强制杀死进程,不会执行 ShutdownHook 通过 actuate 端点实现优雅停机 POST 请求 /actuator/shutdown 即可执行优雅关机...catch (InterruptedException ex) { Thread.currentThread().interrupt(); } // 此处close 逻辑和上边 shutdownhook

    2.1K21

    springboot日志系统的设计缺陷

    再来看下springboot中关闭日志系统的机制 logging.register-shutdown-hook参数默认是true,该参数会注册jvm hook在进程关闭时关闭日志系统 以logback为例看shutdownHook...() -> spring.stop)); Runtime.getRuntime().addShutdownHook(new Thread(() -> logSystem.stop)); -jvm的不同shutdownHook...执行是并行的也就造成了,spring容器的关闭和日志系统关闭时间先后的不确定 在springboot2.5.0之前,logging.register-shutdown-hook默认false,不会注册日志系统的shutdownHook...比如下图红圈里就应该提供一个回调 spring关闭后只是将active标示为了false,并没有回调 该问题已经在社区被注意到了,但是修复起来好像比较麻烦,因为日志系统的关闭一开始从设计上的思路就不对,就不该依赖并行的jvm shutdownHook

    45574
    领券