2013-04-10 71 views
0

石英调度程序的新功能。我试图实现的是在将来触发一个触发器,然后关闭调度器。我为此使用了scheduler.shutdown(true),但在执行作业之前它会关闭。我必须调用shutdown(),因为我将在Web应用程序中实现调度程序。石英调度程序在执行作业之前关闭

那么如何在作业执行后关闭调度程序?

JOB:

public class HelloJob implements Job { 

    public HelloJob(){ 
    } 

    public void execute(JobExecutionContext context) 
      throws JobExecutionException { 
       System.out.println("Hello Quartz on " + new Date());  
      } 
} 

调度程序:

public class QuartzTest { 

    public void scheduleLoad(String time) { 
     try { 
      // Transform user input into a date 
      SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy:HH:mm:ss"); 
      Date scheduleDate = dateFormat.parse(time); 

      // Print Current vs. Scheduled time/date 
      System.out.println("Current time - " + new Date()); 
      System.out.println("Scheduled time - " + scheduleDate); 

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

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

      // Define a job and tie it to a class 
      JobDetail job = newJob(HelloJob.class) 
        .withIdentity("job1", "group1") 
        .build(); 

      // Trigger job to run now and repeat every 10 secs 
      SimpleTrigger trigger = (SimpleTrigger) newTrigger() 
        .withIdentity("trigger1", "group1") 
        .startAt(scheduleDate) 
        .forJob("job1","group1") 
        .build(); 

      // Schedule job using trigger 
      scheduler.scheduleJob(job, trigger); 

      // Shutdown the scheduler after job is executed 
      scheduler.shutdown(true); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String[] args) { 
     String runTime = "04/10/2013:20:07:00"; 
     QuartzTest quartz = new QuartzTest(); 
     quartz.scheduleLoad(runTime); 
    } 
} 

输出:

Current time - Wed Apr 10 20:06:31 IST 2013 
Scheduled time - Wed Apr 10 20:07:00 IST 2013 
[main] INFO org.quartz.impl.StdSchedulerFactory - Using default implementation for ThreadExecutor 
[main] INFO org.quartz.simpl.SimpleThreadPool - Job execution threads will use class loader of thread: main 
[main] INFO org.quartz.core.SchedulerSignalerImpl - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl 
[main] INFO org.quartz.core.QuartzScheduler - Quartz Scheduler v.2.1.7 created. 
[main] INFO org.quartz.simpl.RAMJobStore - RAMJobStore initialized. 
[main] INFO org.quartz.core.QuartzScheduler - Scheduler meta-data: Quartz Scheduler (v2.1.7) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED' 
    Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. 
    NOT STARTED. 
    Currently in standby mode. 
    Number of jobs executed: 0 
    Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. 
    Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. 

[main] INFO org.quartz.impl.StdSchedulerFactory - Quartz scheduler 'DefaultQuartzScheduler' initialized from default resource file in Quartz package: 'quartz.properties' 
[main] INFO org.quartz.impl.StdSchedulerFactory - Quartz scheduler version: 2.1.7 
[main] INFO org.quartz.core.QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started. 
[main] INFO org.quartz.core.QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutting down. 
[main] INFO org.quartz.core.QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED paused. 
[main] INFO org.quartz.core.QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutdown complete. 

quartz.properties:

org.quartz.scheduler.instanceName = MyScheduler 
org.quartz.threadPool.threadCount = 3 
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore 
org.quartz.scheduler.skipUpdateCheck: true 

回答

5

我想你误解的scheduler.shutdown(true);的目的,将等待执行作业完成,但它不会等待预定作业开始和结束。在关闭调度程序之前,您的工作没有开始。在关闭它之前,您可以放置​​一个Thread.sleep(wait);。为了让您的代码运行,因为我知道你想要它,删除此行(你基本上不用以往任何时候都需要关闭调度程序):

// Shutdown the scheduler after job is executed 
scheduler.shutdown(true); 

另外,移动此行,它就会只执行一次。当你把它取决于你的应用程序,它可以在main方法的独立的应用程序,或者在Servlet的init方法或在Web应用程序运行的监听器,如果:

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

跟帖:

我不明白你为什么需要关闭Quartz。如果其他用户需要安排任务,会发生什么情况?你计划在每个计划任务中启动一个不同的Quartz实例吗?根据需要运行并安排任务会更有意义。这是运行Quartz的正常方式。你可能能够以你想要的方式行事,但它可能是人为的。如果你真的只想在启动任务后关闭并在任务运行后关闭,可能需要查看JDK提供的Timer和TimerTask。见示例here

+0

好的,但是如果我不能预测'等待'将会是什么值?例如 - 在Web应用程序中,假设我让用户安排只运行一次的作业,但在5/3/4/2天后,我将如何在应用程序中硬编码Thread.sleep(wait)? – 2013-04-11 07:31:26

+1

正常的做法是让石英模拟器在你的应用程序中运行。如果您只需要执行一项工作然后停止,那么为什么要使用调度程序呢? – darrenmc 2013-04-11 09:54:41

+0

@darrenmc因为这一项工作将由用户安排在一个月后执行。之后,该线程应该被杀死吗?你在说什么是一个cronTrigger的权利?我将使用简单的触发器 – 2013-04-11 11:16:44