1

初めてジョブを保存し、以下のコードで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_DETAILSQRTZ_TRIGGERS

私の疑問は、DBに保存されているジョブをどのようにスケジュールするかです。jspページにジョブのリストを表示する方法とそれらを自動的にトリガーする方法。私たちのものは、Hibernate3ORMを使用したstruts2アプリケーションです。アプリケーションのロード時にクォーツスケジューラを初期化しようとしています。しかし、できません。

4

2 に答える 2

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

これが呼び出されると、あなたの仕事は次の発砲時間にスケジュールされます。スケジュールされたジョブは、適切なDBテーブルに保存されます。jspでジョブのリストを表示するには、ジョブキーとジョブに伴うカスタム記述を別のDBテーブルに永続化して、取得中にこのカスタム記述とデータクォーツが独自のテーブルに永続化できるようにする必要があります。 。このジョブを自動的にトリガーすることは、Quartzが処理するものです。クローン式が目的の値に設定され、Jobクラスが実装されるとorg.quartz.Job、Quartzはexecute() 目的の次の起動時にメソッドを実行します。

于 2012-07-03T09:48:30.310 に答える
1
JobDetail job = newJob(SimpleJob.class).withIdentity("job2", "group2").build();

SimpleJobこれは、を実装するという名前のクラスがあることを意味しますorg.quartz.Job。そのクラスでは、execute()メソッドを実装する必要があります。で指定した時間にジョブが自動的にトリガーされcron expressionます。そのexecuteメソッドは、ジョブがトリガーされたときに呼び出されます。

于 2012-07-03T08:25:39.740 に答える