2012-07-03 2 views
0

처음으로 작업을 저장하고 아래 코드와 함께 crontrigger를 사용하여 작업을 예약했습니다.JDBC JobStore를 사용하는 Quartz Scheduler

package com.generalsentiment.test.quartz; 

import static org.quartz.CronScheduleBuilder.cronSchedule; 
import static org.quartz.JobBuilder.newJob; 
import static org.quartz.TriggerBuilder.newTrigger; 

import java.util.Date; 
import java.util.Properties; 

import org.quartz.CronTrigger; 
import org.quartz.JobDetail; 
import org.quartz.Scheduler; 
import org.quartz.SchedulerFactory; 
import org.quartz.SchedulerMetaData; 
import org.quartz.impl.StdSchedulerFactory; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

public class CronTriggerExample { 

    public void run() throws Exception { 
     Logger log = LoggerFactory.getLogger(CronTriggerExample.class); 

     System.out.println("------- Initializing -------------------"); 

     Xml config = new Xml("src/hibernate.cfg.xml", "hibernate-configuration"); 

     Properties prop = new Properties(); 
     prop.setProperty("org.quartz.scheduler.instanceName", "ALARM_SCHEDULER"); 
     prop.setProperty("org.quartz.threadPool.class", 
         "org.quartz.simpl.SimpleThreadPool"); 
     prop.setProperty("org.quartz.threadPool.threadCount", "4"); 

     prop.setProperty("org.quartz.threadPool 
         .threadsInheritContextClassLoaderOfInitializingThread", "true"); 

     prop.setProperty("org.quartz.jobStore.class", 
          "org.quartz.impl.jdbcjobstore.JobStoreTX"); 
     prop.setProperty("org.quartz.jobStore.driverDelegateClass", 
          "org.quartz.impl.jdbcjobstore.StdJDBCDelegate"); 
     prop.setProperty("org.quartz.jobStore.dataSource", "tasksDataStore"); 
     prop.setProperty("org.quartz.jobStore.tablePrefix", "QRTZ_"); 
     prop.setProperty("org.quartz.jobStore.misfireThreshold", "60000"); 
     prop.setProperty("org.quartz.jobStore.isClustered", "false"); 

     prop.setProperty("org.quartz.dataSource.tasksDataStore.driver", 
       config.child("session-factory").children("property").get(1).content()); 
     prop.setProperty("org.quartz.dataSource.tasksDataStore.URL", config.child("session- 
      factory").children("property").get(2).content()); 
     prop.setProperty("org.quartz.dataSource.tasksDataStore.user", config.child("session- 
      factory").children("property").get(3).content()); 
     prop.setProperty("org.quartz.dataSource.tasksDataStore.password", 
      config.child("session-factory").children("property").get(4).content()); 
     prop.setProperty("org.quartz.dataSource.tasksDataStore.maxConnections", "20"); 

     // First we must get a reference to a scheduler 
     SchedulerFactory sf = new StdSchedulerFactory(prop); 
     Scheduler sched = sf.getScheduler(); 

     System.out.println("------- Initialization Complete --------"); 

     System.out.println("------- Scheduling Jobs ----------------"); 

     // jobs can be scheduled before sched.start() has been called 

     // job 1 will run exactly at 12:55 daily 
     JobDetail job = newJob(SimpleJob.class).withIdentity("job2", "group2").build(); 

     CronTrigger trigger = newTrigger().withIdentity("trigger2", "group2") 
              .withSchedule(cronSchedule("00 15 15 * * 
                 ?")).build(); 

     Date ft = sched.scheduleJob(job, trigger); 
     System.out.println(sched.getSchedulerName()); 
     System.out.println(job.getKey() + " has been scheduled to run at: " + ft 
       + " and repeat based on expression: " 
       + trigger.getCronExpression()); 

     System.out.println("------- Starting Scheduler ----------------"); 

     /* 
     * All of the jobs have been added to the scheduler, but none of the 
     * jobs will run until the scheduler has been started. If you have 
     * multiple jobs performing multiple tasks, then its recommended to 
     * write it in separate classes, like SimpleJob.class writes 
     * organization members to file. 
     */ 
     sched.start(); 

     System.out.println("------- Started Scheduler -----------------"); 

     System.out.println("------- Waiting five minutes... ------------"); 
     try { 
      // wait five minutes to show jobs 
      Thread.sleep(300L * 1000L); 
      // executing... 
     } catch (Exception e) { 
     } 

     System.out.println("------- Shutting Down ---------------------"); 

     sched.shutdown(true); 

     System.out.println("------- Shutdown Complete -----------------"); 

     SchedulerMetaData metaData = sched.getMetaData(); 


     System.out.println("Executed " + metaData.getNumberOfJobsExecuted() + " jobs."); 

    } 

    public static void main(String[] args) throws Exception { 

     CronTriggerExample example = new CronTriggerExample(); 
     example.run(); 
    } 
    } 

그리고 세부 사항은 테이블에 저장됩니다 - QRTZ_CRON_TRIGGERS, QRTZ_JOB_DETAILS & QRTZ_TRIGGERS

내 의심의 여지가 DB에 저장되어있는 작업을 예약하는 방법입니다. JSP 페이지에 작업 목록을 표시하는 방법 & 자동으로 트리거하는 방법. 우리는 Hibernate3 ORM이있는 struts2 응용 프로그램입니다. 응용 프로그램이로드 될 때 석영 스케줄러를 초기화하려고합니다. 그러나 할 수 없습니다.

+0

Quartz 매뉴얼이 작업을 트리거하고 예약하는 방법을 알려줍니다 . –

+0

documentation @ Java Quartz site - http://quartz-scheduler.org/documentation/quartz-2.1.x/ –

+0

같은 질문을 반복해서 게시하는 것 같습니다. 원래 질문을 사용하는 것이 가장 좋은 이유는 무엇입니까? – davidfrancis

답변

3
Date ft = sched.scheduleJob(job, trigger); 

이 작업을 호출하면 작업이 다음 발사 시간으로 예약됩니다. 스케줄 된 작업은 해당 DB 테이블에 저장됩니다. jsp의 작업 목록을 표시하려면 작업 키와 작업이 다른 DB 테이블에 수반되는 사용자 정의 설명을 유지해야합니다. 검색 중에이 사용자 정의 설명과 Quartz가 자체적으로 보유하는 데이터를 검색 할 수 있습니다. 테이블. 이 작업을 자동으로 트리거하면 Quartz가 처리합니다. 크론 표현식이 원하는대로 설정되고 Job 클래스가 org.quartz.Job을 구현하면 Quartz는 원하는 다음 화재 시간에 execute() 메소드를 실행합니다.

+0

Quartz에서 REST API를 사용하여 작업을 예약하고 liquibase를 사용하여 데이터베이스 마이그레이션을 관리하는 블로그 게시물을 작성했습니다. http://juliuskrah.com/tutorial/2017/10/06/persisting-dynamic-jobs-with-quartz-and-spring/ –

1
JobDetail job = newJob(SimpleJob.class).withIdentity("job2", "group2").build(); 

이것은 당신이 org.quartz.Job를 구현 SimpleJob라는 이름의 클래스를 의미합니다. 그 클래스에서 execute() 메소드를 구현해야합니다. 작업은 cron expression으로 지정한 시간에 자동으로 실행됩니다. 실행 메소드는 작업이 트리거 될 때 호출됩니다.

+0

예, 작업이 실행되었으며 세부 사항이 저장되었습니다. DB. 그러나 DB 정보로 작업이 자동으로 실행되는 방법은 무엇입니까? –

+0

quartz의 구현 ... 그리고 그것을 사용하고 있습니다 ..--) –

관련 문제