使用JDBC JobStore的Quartz Scheduler

时间:2012-07-03 07:29:46

标签: java struts2 quartz-scheduler job-scheduling

我第一次存储作业并使用crontrigger使用以下代码安排它们。

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_TRIGGERSQRTZ_JOB_DETAILS& QRTZ_TRIGGERS

我的疑问是如何安排存储在DB中的作业。如何在jsp页面中显示作业列表&如何自动触发它们。 我们是使用Hibernate3 ORM的struts2应用程序。我正在尝试在应用程序加载时初始化quartz调度程序。但我无法做到。

2 个答案:

答案 0 :(得分:3)

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

调用此功能后,您的工作将安排在下一个开火时间。计划的作业将存储在相应的DB表中。 要在jsp上显示作业列表,您应该将作业键以及作业所需内容的自定义描述保留到另一个DB表中,以便在检索期间可以检索此自定义描述以及数据Quartz持久存储到其自己的表中。 Quartz会自动触发此作业。将crone表达式设置为所需内容并且Job类实现org.quartz.Job后,Quartz将在您所需的下一个触发时间运行execute()方法

答案 1 :(得分:1)

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

这意味着您将拥有一个名为SimpleJob的类来实现org.quartz.Job。在那个类execute()方法需要实现。在cron expression指定的时间自动触发作业。触发作业时会调用该execute方法。