Quartz Scheduler using JDBC JobStore

*爱你&永不变心* 提交于 2019-12-11 05:39:53

问题


For the first time i stored the jobs and scheduled them using crontrigger with the below code.

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

And the details are stored in Tables - QRTZ_CRON_TRIGGERS, QRTZ_JOB_DETAILS & QRTZ_TRIGGERS

My doubt is How to schedule the jobs that are stored in DB. How to display the list of jobs in a jsp page & how to trigger them automatically. Ours is a struts2 application with Hibernate3 ORM. I am trying to initialize the quartz scheduler when the application loads. But am unable to.


回答1:


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

When this is called, your job would be scheduled for the next fire time. The scheduled job would stored in the appropriate DB tables. To Display the list of jobs on a jsp, you should persist you job key as well as custom description of what your job entails to another DB table so that during retrieval you can retrieve this custom description as well as data Quartz persist into its own tables. Triggering this jobs automatically is something Quartz handles for you. Once the crone expression is set to what is desired and your Job class implements org.quartz.Job, Quartz would run the execute() method at your desired next fire time




回答2:


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

this means you will have a class named SimpleJob that implements org.quartz.Job. In that class execute() method need to be implemented. Job is triggered automatically at the time you specified by cron expression. That execute method is called when job is triggered.



来源:https://stackoverflow.com/questions/11306354/quartz-scheduler-using-jdbc-jobstore

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!