2012-04-25 204 views
1

块引用如何防止程序在被中断时丢失数据?

我有功能的Java程序,它需要定期运行。但是,我希望能够关闭包装程序(如果您是UNIX用户,请在终端窗口或SIGTERM中考虑Ctrl + C),而不会有任何中断包装程序启动的主程序进程或线程的风险。

起初,我想我应该让我的主程序在每一轮处理之后的一段时间内进入休眠状态。然后我发现,如果程序需要关闭并且被用户手动中断,那么在处理数据时它可能会被中断,并且输出文件会被切断或损坏。

我在想最好的方法是编写一个包装程序(可能也是用Java)来调用主程序。如果有东西关闭了包装器,我希望主程序的派生线程或程序实例保持打开状态,直到它们准备好关闭为止。另外,主程序的最多一个实例应该随时运行。

这是我想什么我的包装做(在伪代码):

每n分钟: 如果主程序的实例在运行,什么也不做 别的产卵的主要程序的一个实例。

在关闭: 离开主程序运行完,如果它正在运行

我应该使用Java运行时对象/库(有效的命令行)运行我的主程序,或者我应该改变我的主程序实现Runnable并让包装程序产生运行我的主程序的线程?

编辑(可能的解决方案?):

目前我正在考虑使用Java运行时对象调用使用exec功能的主程序(见http://docs.oracle.com/javase/7/docs/api/java/lang/Process.htmlhttp://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html)。要确定主程序是否已经在运行,我可以使用Process.exitValue()函数。如果它抛出IllegalThreadStateException,那么主程序仍在运行。

+0

一个解决方案是不使用控制-C。所有的软件都通过JMX按钮关闭。这使我们能够正确地关闭我们的类,而不必在JVM陷入困境时这样做。 – Gray 2012-04-25 14:24:16

+0

我的程序将从终端/控制台运行,它没有GUI。 – user1258361 2012-04-25 14:32:06

+0

没关系。您仍然可以轻松发布JMX按钮,甚至可以使用JMX命令行客户端关闭应用程序。 – Gray 2012-04-25 14:33:04

回答

0

创建一个以静态方式设置某些标志的新线程。这个线程将在主应用程序的开始处运行,可以从中运行/加载。 在程序的关闭动作上创建一个java事件监听器,并修改它中的新线程。每当你的程序关闭时,这个新的线程将启动其他线程来活动,并最终节省资源以执行上述条件之一。现在你的新进程会一个接一个地杀死这些线程(每当完成任务时),直到满足上述所有条件(标志)。当没有其他线程离开时,这个新线程会自行终止,程序结束。

1

当应用程序获取SIGINT(Control-C)时,可以使用关闭挂接执行有序关闭:请参阅Runtime.addShutdownHook(...)

但是,这并不涉及SIGKILL,JVM崩溃,操作系统崩溃和硬电源故障。事实上,在这种情况下,应用程序无法完全关闭。为此,您需要设计您的应用程序以使用健壮的持久性机制来定期保持其状态。

相关问题