向正在运行的JVM发送信号

8
我正在使用自定义信号处理程序来捕获自定义Java守护程序中的TERM、ABRT和INT信号。我在代码中使用这个处理程序,以便可以通过kill命令向其发送TERM信号并优雅地关闭程序。目前信号处理程序运行正常,但是当我编译代码时,我会收到以下警告(多次):
警告:sun.misc.SignalHandler是Sun专有API,可能会在未来的版本中被删除。
同时使用这些类:
import sun.misc.SignalHandler;
import sun.misc.Signal;

有没有更好的方法向正在运行的JVM发送信号以启动主线程的关闭?我不喜欢将我的代码与此API绑定在一起,因为它可能会在未来被删除。
该代码在Solaris和HPUX上使用1.5.0_22 JVM可以工作。如果您有任何帮助或建议,将不胜感激。我使用了IBM的这篇文档来开发信号处理程序:http://www.ibm.com/developerworks/java/library/i-signalhandling/

1
据我所知,信号处理没有公共API(可能是因为它太依赖于操作系统),因此您必须忍受这个警告。 - biziclop
2个回答

17
首先,要明白这只是针对sun.misc包的标准警告。他们让你知道你正在使用的API不是标准的Java API。这并不意味着他们计划在未来积极删除此API。http://java.sun.com/products/jdk/faq/faq-sun-packages.html 就你的问题而言,我不太清楚为什么默认的java进程处理kill信号的方式对你不够满意:如何优雅地停止java进程?。如果您需要添加其他逻辑,可以添加shutdown hook
如果您正在寻找让Java进程知道该退出的其他方法,您可以让它侦听套接字、stdin或命名管道...
您可能还想了解JVMTI

你的“如何优雅地停止Java进程”非常有帮助。我进行了搜索,不确定为什么错过了那个链接。我检查了执行kill命令的脚本,发现它使用的是“kill -9”。根据那个链接,我认为我发送了错误的信号,强制终止了应用程序(这就是为什么在关闭时必须捕获信号以实现优雅退出)。我打算尝试使用不同的信号和关闭钩子,看看是否能找到更好的解决方案。 - jmq
3
最终这样做成功了,我能够将这两个类从项目中删除。您的建议很有帮助,谢谢。 - jmq

3
你可以通过JMX来实现这一点。 JMX是一组标准的API,可用于监视和管理Java应用程序。
以下链接可帮助您入门:

http://onjava.com/pub/a/onjava/2004/09/29/tigerjmx.html

http://www.ibm.com/developerworks/java/library/j-jtp09196/index.html?ca=drs

主要思路如下:
a) 你会有一个布尔变量,比如isShutDownTriggered。你将有一个线程,它将运行一个无限循环,每2秒睡眠一次,并不断检查此变量的值。当值为true时,您将执行代码以关闭应用程序。
b) 然后编写一个mxbean(请参阅上面的链接)。这个mxbean将用于将"isShutDownTriggered"的值更改为true。您可以使用像jconsole / jManage这样的工具来查看和修改Java应用程序的mxbean。一旦"isShutDownTriggered"被设置为true,上述线程就会知道并执行应用程序的关闭。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接