从jvm外面停止计时器

时间:2011-10-16 11:30:10

标签: java

我有一个长时间运行的计时器任务。它实际上是一个批处理过程,它将永远循环并运行它的东西。该批处理程序是用Java编写的。现在我如何要求它优雅地关闭,例如我需要做一些维护?从JVM外部?

我可以想到一些肮脏的方法,在run方法的每个循环结束时,让它检查某个目录中是否存在文件。如果存在则会停止。或者创建一个数据库记录,要求它停止。

还有另一种更好的方法吗?

3 个答案:

答案 0 :(得分:5)

您可能希望为程序添加对MBean的支持,并通过jconsole向它发送命令。

以下是MBeans链接:

http://download.oracle.com/javase/1.5.0/docs/guide/management/overview.html

http://en.wikipedia.org/wiki/Java_Management_Extensions

答案 1 :(得分:2)

你可以添加一个shut-down hook,当你杀死进程(通过任务管理器)干净地关闭时会运行

Runtime.getRunTime().addShutDownHook(new Thread(){
    public void run(){
        //do shutdown (interrupt threads and tell them to shut down)
    }
});

答案 2 :(得分:1)

为了正常关机,服务必须定期检查。它可能是每个循环的结束(或开始)或更少的频率。所以我认为你的方法是正确的。

检查文件是否存在是一种很好的方法。必须删除文件可能会很繁琐 - 一个选项是方法本身在退出之前删除文件。

其他选项是在应用程序中运行一些套接字侦听器。但是可能存在安全问题。