在使用其他Java程序进行未捕获的异常后重启Java是否安全?

时间:2016-02-02 13:06:36

标签: java exception-handling

我正在开发一个项目,该项目必须处理作为 Java 程序输入的外部信号。信号可能已损坏(即我们对输入没有太多控制),这可能导致处理错误(例如 DivisionByZeroException )。

我的团队想要的是,每次抛出未捕获的异常,导致Java程序终止,某些代码应该重新启动 Java程序从头开始。< / p>

因此,我的主要问题是:以下列方式编写某些代码的危险吗?

我的解决方案(某些代码将是另一个Java类):

  1. 假设我们的Java程序是作为C类的方法M 实现的,一次调用 理想情况应该运行永久

  2. 我首先让C类实现Runnable 界面。

  3. 然后覆盖运行方法为:

    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
            ....
        }
    
    }
    
  4. 最后,我在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();
                  }
              }
          }
      }
    
    }
    
  5. 我希望我们可以按如下方式运行系统:

    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脚本更安全吗?

0 个答案:

没有答案