2013-04-10 4 views
0

석영 스케쥴러에 처음 입문되었습니다. 내가 성취하고자하는 것은 미래에 하나의 방아쇠를 당긴 다음 스케줄러를 종료하는 것입니다. 이 경우 scheduler.shutdown(true)을 사용하고 있지만 작업을 실행하기 전에 종료됩니다. 나는 웹 애플 리케이션에서 스케줄러를 구현하려고하기 때문에 shutdown()을 호출해야한다.작업 실행 전에 석영 스케줄러가 종료됩니다.

그래서 작업을 실행 한 후 스케줄러를 종료 하시겠습니까?

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); 

이 줄을 이동 : 나는 당신이,이 선 (당신은 기본적으로 지금까지 스케줄러를 종료 할 필요가 없습니다)를 제거하려는 이해로 실행하도록 코드를 얻으려면 . 당신이 그것을 넣어 경우, 응용 프로그램에 따라 달라집니다, 그것은 독립 실행 형 응용 프로그램의 주요 방법, 또는 수있는 서블릿의 init 메소드 또는 웹 응용 프로그램에서 실행되는 리스너의 경우에 :

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

추가 답변 :

왜 Quartz를 종료해야하는지 이해가되지 않습니다. 다른 사용자가 작업을 예약해야한다면 어떻게됩니까? 예약 된 작업마다 다른 Quartz 인스턴스를 시작할 계획인가? 필요에 따라 작업을 실행하고 일정을 잡는 것이 더 합리적 일 것입니다. 이것이 바로 Quartz를 실행하는 일반적인 방법입니다. 당신이 원하는 방식으로 행동하게 할 수는 있지만 인위적 ​​일 수 있습니다. 작업이 시작된 후 시작되고 종료되는 무언가를 원할 경우 JDK에서 제공하는 Timer 및 TimerTask를 살펴볼 수 있습니다. 예 here을 참조하십시오.

+0

하지만 '대기'의 값을 예측할 수 없다면 어떻게해야합니까? 예를 들어, 웹 앱에서 사용자가 한 번만 실행할 작업을 예약하도록하고 5/3/4/2 일 후에 내 앱에서'Thread.sleep (wait)'을 어떻게 하드 코딩합니까? –

+1

일반적인 연습은 석영 scheuduler가 당신의 평생 동안 응용 프로그램을 실행하는 것입니다. 한 작업 만 실행하고 그 다음 작업을 중단해야한다면 왜 스케쥴러를 사용해야합니까? – darrenmc

+0

@ darrenmc 한 작업이 사용자가 한 달 후에 실행하기 위해 예약하기 때문에. 그 후에 스레드가 나중에 죽어야합니까? 무슨 소리하는거야 cron 방아쇠 맞지? 나는 간단한 Trigger를 사용할 것이다 –

관련 문제