我正在开发一个项目,该项目必须处理作为 Java 程序输入的外部信号。信号可能已损坏(即我们对输入没有太多控制),这可能导致处理错误(例如 DivisionByZeroException )。
我的团队想要的是,每次抛出未捕获的异常,导致Java程序终止,某些代码应该重新启动 Java程序从头开始。< / p>
因此,我的主要问题是:以下列方式编写某些代码的危险吗?
我的解决方案(某些代码将是另一个Java类):
假设我们的Java程序是作为C类的方法M 实现的,一次调用 ,理想情况应该运行永久
我首先让C类实现Runnable 界面。
然后覆盖运行方法为:
class C implements Runnable {
@Override
public void run() {
this.M();
}
public void M() {
// Code for main method to be called ONCE and ideally run FOREVER
....
}
}
最后,我在C类周围创建一个包装器(称为 Recovery 类),每次抛出异常时重新启动C.M():
class Recovery {
final Object lock = new Object();
void runAndRecover(final Runnable runnable) { // Will pass an instance of C
while (true) {
// Synchronising to make sure that only one instance
// of runnable input is running at the time.
synchronized(lock) {
try {
runnable.run();
// Ideally the process should run forever
// (no termination),
// and the code of THIS FILE will be blocked HERE
// with the runnable RUNNING (which is what we want).
} catch (Exception exception) {
// If the process was interrupted
// by uncaught exception,
// we will restart it.
lock.notifyAll();
}
}
}
}
}
我希望我们可以按如下方式运行系统:
public static void main(final String[] args) {
C c = new C();
Recovery recovery = new Recovery();
recovery.runAndRecover(c);
// My hope is that code gets blocked HERE and runs REGARDLESS
// of anything happening inside c. Can I make such assumption?
}
一个附带问题:如果这种方法不安全,我可以编写一个shell脚本,每次抛出异常时重启Java程序。 重复执行命令 sudo java / path / to / Program 的简单shell循环是什么?编写shell脚本更安全吗?