问题标签 [shutdown-hook]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1846 浏览

java - 关闭钩子不会杀死执行者

我有以下代码:

当它运行时,我得到以下控制台输出:

当我运行它时,应用程序永远不会终止。相反,每隔 5 秒,我就会看到一个新的“任务正在运行!”的 println。我本来希望主线程到达main方法的末尾,打印“正在初始化关闭...”,调用添加的关闭挂钩,杀死执行程序,最后打印出“关闭挂钩完成!”。

相反,“任务正在运行”只是不断打印,程序永远不会终止。这里发生了什么?

0 投票
1 回答
651 浏览

java - 可以通过关闭挂钩调用 servlet 过滤器的 destory 方法还是有更好的解决方案?

我有一个 Java servlet 过滤器,只要不再使用过滤器,它就应该清理一些资源。这是通过实施该Filter.destory方法来实现的。现在我想知道当整个servlet容器关闭时是否也会调用这个方法。因此,我想知道是否应该为此安装一个关闭挂钩。或者Filter.destroy当 servlet 容器关闭时总是调用该方法。

当我在关闭挂钩中设置断点时,我永远不会到达它。但我猜这是因为 IntelliJ 已经断开连接或其他类似的原因。这使得通过实验很难找出答案。

谢谢你的帮助!

0 投票
4 回答
6889 浏览

java - Java 线程和关闭挂钩

我刚刚遇到了一个有趣的问题。似乎,如果在 Java 中,一个线程调用System.exit()它就不能通过Thread.join().

这引起了我的问题,因为我想在我的应用程序之后使用关闭挂钩进行清理,例如:

这个想法是它确保线程在关闭这些资源之前已经完成了它们各自的资源。问题是有 3 种情况可以调用关闭挂钩。他们是:

  1. 用户点击 [ctrl] + [C]。
  2. 阅读器线程完成,并调用System.exit().
  3. Writer 线程完成,并调用System.exit().

第一种情况,用户点击 [ctrl] + [C] 可以正常工作。但在其他两种情况下,关闭挂钩会永远阻塞。这是一个连锁效应,Thread.join()即针对已经调用过的线程调用的oneSystem.exit()永远阻塞。

因此,我有 2 个问题。首先,我知道我可以改用Thread.join(long millis)它们,这样它们就不会无限期地阻塞,但是谁能想到一个更优雅的解决方案?其次,虽然一个人可以调用Thread.join()同一个线程两次,而第二次它会立即返回,有没有人知道为什么调用Thread.join()一个已经System.exit()无限期调用块并且不立即返回的线程的原因?

0 投票
5 回答
2509 浏览

java - 是否存在与 Java 运行时 ShutdownHook 即 StartupHook 等价的逆向方法?

我正在寻找 Java 运行时中 ShutdownHook 的一般反向等效项,即类似于StartupHook的东西,在 JVM 首次启动时可以执行某些自定义预热或设置代码。

我知道在启动 Servlet 容器时使用 ServletContexts 等替代方案,或者在 Spring 等其他框架中使用类似的功能。但这些不是我想要的。我正在寻找一个通用的 JVM 解决方案,如果有的话。

请让我知道 StartupHook 的整个想法是否不适合 JVM 以及为什么。

更新:在浏览完所有提供的答案(谢谢大家)之后,似乎最接近我正在寻找的是 Java 代理。

虽然如果JVM允许我做这样的事情会很好(从易用的角度来看,但可能不是从安全的角度来看):

  1. 编写一个只用一种方法实现 StartUpHook 的类 - void preMain()
  2. 将该类放入 jar 文件并将该 jar 放入类路径或 JRE 扩展目录
  3. 当 JVM 启动时,它会在类路径中查找所有实现 StartUpHook 的类,然后调用它的 preMain() 方法。
0 投票
0 回答
489 浏览

tomcat - 在 webapp 仍在运行时接收 tomcat 关闭通知

我是否正确假设在调用 ServletContextListener.contextDestroyed() 时,相应的 Web 应用程序将不再接受 HttpRequests?

如果是,是否有任何方法可以在仍接受请求/提供内容的同时收到即将关闭的通知?

0 投票
1 回答
149 浏览

java - Java ShutDownHook 未在 Windows 上触发

我有以下 ShutdownHook 来检测应用程序何时退出:

这在 Mac 操作系统上完美运行,但由于某种原因,在 Windows 上什么都没有触发。

任何想法我缺少什么?

0 投票
0 回答
398 浏览

java - Linux 上的 Java 6 - SIGTERM 或 SIGINT 信号未启动关闭挂钩

我们最近将 Java 运行时环境从旧的 Sun/Oracle Java 6 版本 (1.6.0_18) 更新到了最新版本 1.6.0_45。我们的应用程序在没有 -Xrs 选项的 Java 运行时中运行。我们现在看到,如果向 Java 运行时进程发送 SIGTERM 或 SIGINT 信号,我们的关闭钩子不会被执行。但是如果发送了 SIGHUP,则会启动关闭挂钩。

此行为似乎与 Linux 上 Oracle Java 运行时的记录行为相矛盾。有没有其他人看到这个问题或有想法检查我们的 Linux 环境中可能导致我们观察到的行为的其他变化?

0 投票
1 回答
141 浏览

scala - Neo4j - 数据库关闭

我正在使用嵌入在我的 Scala 项目中的 Neo4j。我一直在包括

事务开始之前的每个函数中的上述代码。我是否需要将它包含在每个功能中。如果我不包含它会怎样?

0 投票
2 回答
232 浏览

java - java创建非合作线程进行测试

我已经被一个不会合作并干净退出的java进程所困扰(它会被埋在一些我无法控制的低级库中)。我现在正在测试一种看门狗,它在某个预先确定的时间对进程实施硬停止,ScheduledStop. 该看门狗是一个单独的类,它运行一个独立的线程,如果预定的停止时间到达,它将终止整个进程。通常,所有线程都应该在该硬停止时间之前很好地返回,并且程序会优雅地退出。但是,如果有必要,进程会自行终止,文件锁会被释放等。所有这些都在 Linux 上运行。

我似乎记得,即使System.exit(0)不是万无一失的(我认为如果某些关闭挂钩卡住,该过程可能会保持活动状态),所以我编造了一些类似的东西:

现在,我想用一些非常不合作的线程来测试它,可能还有一些关闭钩子,这些钩子是为了测试而设计的,效果不佳。

下面的最初的 NastyThread 并不是那么讨厌......它忽略了InterruptionException,但不阻止System.exit(0)。我怎样才能让我的虚拟机进入一个甚至exit()不会终止的状态?

另一个问题是,虽然看门狗线程在理论上是独立的,但其他线程完全抢占它,从而挫败预定停止的条件是什么?

如有必要,我可以启动一个单独的进程(例如一个简单的 perl 脚本),在某个指定时间杀死父进程(java 进程)。

0 投票
1 回答
3818 浏览

java - 关闭 Tomcat 服务器时无法加载 org.apache.hadoop.util.ShutdownHookManager

我有一个在 tomcat 上运行的简单 Web 应用程序。此 Web 应用程序读取和写入文件到 HDFS。

我面临的问题是每次使用./bin/shutdown.sh. 我得到了无法加载 hadoop shutdownHookManager 异常。

我确信 hadoop-common(包含 ShutDownManager)在 tomcat 类路径中。

谁能帮我吗?

我得到的例外: