2012-02-22 45 views
2

我正在使用来自StdSchedulerFactory的Quartz 2.0.1调度程序。我在代码中捕获SchedulerException我是否需要关闭Quartz调度程序在finally块中?

我应该关闭在finally块中的调度:

} finally { 
    scheduler.shutdown(); 
} 

或者我应该做try块关机?

关机方法可以抛出SchedulerException,所以看起来关机不应该在finally块中。

回答

0

在任何情况下,您都不必在finally块中执行它,因为如果调度程序成功启动,它不会抛出SchedulerException,因此如果您到达catch块SchedulerException,这意味着调度程序从不是开始。所以,你不应该关闭从未开始的调度程序。

下面是项目homepage的示例程序。

public class QuartzTest { 

    public static void main(String[] args) { 

     try { 
      // Grab the Scheduler instance from the Factory 
      Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); 

      // and start it off 
      scheduler.start(); 

      scheduler.shutdown(); 

     } catch (SchedulerException se) { 
      se.printStackTrace(); 
     } 
    } 
} 

而且,从上面的链接,

一旦你获得使用StdSchedulerFactory.getDefaultScheduler()调度,您的应用程序将不会终止,直到调用scheduler.shutdown(),因为会有活动线程。

+0

所以,换句话说,你应该几乎肯定会调用'从某处scheduler.shutdown()'在你的代码,因为如果不这样做的应用程序可能不会停止。根据应用程序的设计,finally块可能是也可能不是正确的地方。应用程序关闭时触发的事件监听器是另一个放置'scheduler.shutdown()'的地方。不停止石英(例如在Web应用程序中)可能导致严重的类加载器相关的内存泄漏。 – 2012-02-27 08:11:58

0

对上述答案进行抨击时,如果除开始/关闭之外还有其他代码,它可能仍会遇到问题。例如,如果你有这样的事情:

public class QuartzTest { 
    public static void main(String[] args) { 

     try { 
      // Grab the Scheduler instance from the Factory 
      Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); 

      // and start it off 
      scheduler.start(); 
      System.out.println(args[5]); 
      scheduler.shutdown(); 

     } catch (SchedulerException se) { 
      se.printStackTrace(); 
     } 
    } 
} 

应用程序将永远不会调用关机,因为你有一个ArrayIndexOutOfBoundsException(或类似的东西)结束。有很多方法可以解决这个问题,但最简单的方法可能是将所有中间代码包装在异常处理程序中并“处理”那些东西。例如: 公共类QuartzTest {

public static void main(String[] args) { 

    try { 
     // Grab the Scheduler instance from the Factory 
     Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); 

     // and start it off 
     scheduler.start(); 
     try { 
      System.out.println(args[5]); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     scheduler.shutdown(); 

    } catch (SchedulerException se) { 
     se.printStackTrace(); 
    } 
} 

}

相关问题