2011-02-16 73 views
8

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

警告: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(可能是因为它太OS特定),所以你必须忍受这个警告。 – biziclop 2011-02-16 23:39:20

回答

17

首先,要明白这只是sun.misc软件包的标准警告。他们让你知道你使用的API不是标准的Java API。这并不意味着他们正在积极计划在将来删除此API。 http://java.sun.com/products/jdk/faq/faq-sun-packages.html

至于你的问题,它不是很清楚为什么java进程处理kill信号的默认方式是不够的:How to stop java process gracefully?。如果您需要添加其他逻辑,则可以添加shutdown hook

不过,如果你正在寻找其他方式来让你的java程序知道是时候退出,你可以把它监听套接字,或标准输入,或命名管道上...

你可能也想看看JVMTI

+0

“如何优雅地停止java进程”非常有帮助。我做了一个搜索,我不确定我错过了那一个。我查看了执行kill的脚本,它正在执行“kill -9”。根据链接,我认为我发送了错误的信号,并且严重地破坏了应用程序(这就是为什么我必须在关闭期间捕捉信号以优雅退出)。我将尝试一个不同的信号,并关闭挂钩,看看这是否是更好的解决方案。 – jmq 2011-02-17 00:49:17

3

你可以通过JMX做到这一点。 JMX是一套标准的apis,可用于监控和管理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,上面的线程就会知道它并将执行关闭应用程序