将信号发送到正在运行的JVM

我正在使用自定义信号处理程序来捕获自定义Java守护程序中的TERM,ABRT和INT信号。 我在代码中有这个处理程序,以便我可以向它发送TERM信号并通过kill命令正常关闭程序。 信号处理程序现在正常工作,但是当我编译代码时,我收到以下警告(多次):

警告:sun.misc.SignalHandler是Sun专有API,可能会在将来的版本中删除

使用这些类时:

import sun.misc.SignalHandler; import sun.misc.Signal; 

有没有更好的方法将信号发送到正在运行的JVM以启动主线程的关闭? 我不希望将我的代码绑定到此API,以便将来可以将其删除。

此代码现在使用1.5.0_22 JVM在Solaris和HPUX上运行。 任何帮助或建议将不胜感激。 我使用IBM的这个文档来开发信号处理程序:

http://www.ibm.com/developerworks/java/library/i-signalhandling/

首先,要了解这只是sun.misc包的标准警告。 他们告诉您,您使用的API不是标准的Java API。 这并不意味着他们将来会积极计划删除此API。 http://java.sun.com/products/jdk/faq/faq-sun-packages.html

至于你的问题,我不太清楚为什么java进程处理kill信号的默认方式对你来说还不够: 如何优雅地停止java进程? 。 如果需要添加其他逻辑,可以添加关闭钩子 。

尽管如此,如果你正在寻找其他方法让你的java进程知道是时候退出了,你可以让它监听套接字,stdin或命名管道……

您可能还想查看JVMTI

你可以通过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)你将有一个布尔变量,比如isShutDownTrigerred。 你将有一个运行无限循环的线程,睡眠2秒,并继续检查这个变量值。 当值为true时,您将执行将关闭应用程序的代码。

b)然后你写一个mxbean(检查上面的链接)。 此mxbean将用于将“isShutDownTrigerred”值更改为true。 您可以使用jconsole / jManage之类的工具来查看和修改java应用程序的mxbeans。 一旦“isShutDownTriggered”设置为true,上面的线程就会知道它并将执行应用程序的关闭