Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 向正在运行的JVM发送信号_Java_Jvm_Signals - Fatal编程技术网

Java 向正在运行的JVM发送信号

Java 向正在运行的JVM发送信号,java,jvm,signals,Java,Jvm,Signals,我正在使用一个定制的信号处理程序来捕获定制java守护进程中的TERM、ABRT和INT信号。我在代码中有这个处理程序,因此我可以向它发送术语信号,并通过kill命令优雅地关闭程序。信号处理程序现在可以工作,但当我编译代码时,我收到以下警告(多次): 警告:sun.misc.SignalHandler是sun专有的API,可能在将来的版本中被删除 在使用这些类时: import sun.misc.SignalHandler; import sun.misc.Signal; 有没有更好的方法向正

我正在使用一个定制的信号处理程序来捕获定制java守护进程中的TERM、ABRT和INT信号。我在代码中有这个处理程序,因此我可以向它发送术语信号,并通过kill命令优雅地关闭程序。信号处理程序现在可以工作,但当我编译代码时,我收到以下警告(多次):

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

在使用这些类时:

import sun.misc.SignalHandler;
import sun.misc.Signal;
有没有更好的方法向正在运行的JVM发送信号以启动主线程的关闭?我不喜欢把我的代码绑定到这个API上,因为它将来可能会被删除

这段代码现在可以在Solaris和HPUX上使用1.5.0_22 JVM。任何帮助或建议都将不胜感激。我使用IBM提供的本文档来开发信号处理程序:

您可以通过JMX实现这一点。 JMX是一组标准的API,可用于监视和管理java应用程序

以下是一些帮助您入门的链接:

主要思想是:

a) 您将有一个布尔变量,比如ISSHUTDOWNTRIGERD。您将拥有一个线程,该线程将运行一个无限循环,休眠2秒,并不断检查该变量值。当该值为true时,您将执行关闭应用程序的代码


b) 然后编写一个mxbean(检查上面的链接)。此mxbean将用于将“isShutDownTrigerred”值更改为true。可以使用jconsole/jManage等工具查看和修改java应用程序的MXBean。一旦“isShutDownTriggered”设置为true,上述线程就会知道它,并将执行应用程序的关闭。首先,请理解这只是sun.misc包的标准警告。他们让您知道您使用的API不是标准的JavaAPI。这并不意味着他们正在积极计划将来删除这个API

至于您的问题,我不太清楚为什么java进程处理kill信号的默认方式对您来说是不够的:。如果需要添加其他逻辑,可以添加

不过,如果您正在寻找其他方法让java进程知道该退出了,您可以让它在套接字、stdin或命名管道上侦听


据我所知,目前还没有用于信号处理的公共API(可能是因为它太特定于操作系统),所以您可能还想研究一下,所以您必须忍受这个警告。您的“如何优雅地停止java进程”非常有帮助。我做了一次搜索,我不确定我怎么会错过那一次。我看了一下我的脚本,它正在执行kill-9。根据那个链接,我认为我发送了错误的信号,并且硬终止了这个应用程序(这就是为什么我必须在关机时捕获信号才能正常退出)。我将尝试一个不同的信号和关闭挂钩,看看这是否是一个更好的解决方案。这最终奏效了,我能够从项目中删除这两个类。你的建议很有帮助,谢谢。