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

ShutdownHook原理

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

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

ShutdownHook妙用

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

9630

ShutdownHook - Java 优雅停机解决方案

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

94820

Dubbo扩展支持自适应等待无损下线

对于无损下线(平滑下线),Dubbo也提供了ShutdownHook的支持,但这个实现比较简陋。...为解决此问题,我们可实现自适应等待无损下线,移除Dubbo注册的ShutdownHook,自己注册一个ShutdownHook,并在这个ShutdownHook中,先是将此服务提供者节点从注册中心摘除,...由于ShutdownHook的无序和异步特性,如果中间件组件也注册了ShutdownHook,且这些ShutdownHook在Dubbo的ShutdownHook之前已经执行完了,如果还有请求进来,这些请求就无法被正常处理...这种方法注册的Hook是会阻塞后面的Hook的执行的,而Runtime.getRuntime().addShutdownHook注册的ShutdownHook不仅无法控制排序,每个ShutdownHook...都是一个线程,也无法控制ShutdownHook-A执行完之后再到ShutdownHook-B的执行顺序。

73830

拒绝 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

2K21

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

42674
领券