我有一个长时间运行的计时器任务。它实际上是一个批处理过程,它将永远循环并运行它的东西。该批处理程序是用Java编写的。现在我如何要求它优雅地关闭,例如我需要做一些维护?从JVM外部?
我可以想到一些肮脏的方法,在run方法的每个循环结束时,让它检查某个目录中是否存在文件。如果存在则会停止。或者创建一个数据库记录,要求它停止。
还有另一种更好的方法吗?
答案 0 :(得分:5)
您可能希望为程序添加对MBean的支持,并通过jconsole向它发送命令。
以下是MBeans链接:
http://download.oracle.com/javase/1.5.0/docs/guide/management/overview.html
答案 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)
为了正常关机,服务必须定期检查。它可能是每个循环的结束(或开始)或更少的频率。所以我认为你的方法是正确的。
检查文件是否存在是一种很好的方法。必须删除文件可能会很繁琐 - 一个选项是方法本身在退出之前删除文件。
其他选项是在应用程序中运行一些套接字侦听器。但是可能存在安全问题。