Quartzの構築とWebでの使用

20325 ワード

QuartzはOpenSymphonyオープンソース組織のJob scheduling分野におけるもう一つのオープンソースプロジェクトであり、J 2 EEとJ 2 SEアプリケーションを組み合わせても単独で使用することができる.Quartzは、単純または10、100、さらには数万のJobsのような複雑なプログラムを実行するために使用することができます.QuartzはJavaによって完全に作成されたオープンソースジョブスケジューリングフレームワークであり、Javaアプリケーションでのジョブスケジューリングに簡単で強力なメカニズムを提供しています.Quartzでは、開発者が時間間隔に基づいてジョブをスケジュールすることができます.ジョブとトリガの多対多の関係を実現し、複数のジョブを異なるトリガに関連付けることもできます.
参考になる優秀な資料
Quartz Quick Start Guide Chapter 3: Logback configuration
バージョンの説明
Quartzのほかに、logbackも導入されています(詳細なログを見るためですか!)
<dependencies>
    <dependency>
        <groupId>org.quartz-schedulergroupId>
        <artifactId>quartzartifactId>
        <version>2.2.0version>
    dependency>

    <dependency>
        <groupId>ch.qos.logbackgroupId>
        <artifactId>logback-classicartifactId>
        <version>1.1.0version>
    dependency>
dependencies>

シンプルな構築
JArパッケージの導入は、上記のpomファイルを参照してください.さらにquartz.propertiesを加え、quartzの設定に使用します.注意:org.quartz.threadPool.threadCountは、スレッドプールの容量を構成します.つまり、同時に実行可能なスレッドの数を示します.本番環境では、このパラメータは実際の状況に応じて構成されます.quartz.propertiesの構成は次のとおりです.
org.quartz.scheduler.instanceName = MyScheduler
org.quartz.threadPool.threadCount = 3
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

logback.xml、ログフレームワークlogbackの構成.ここではコンソールとログファイルの出力のみを簡単に構成していますよ(>
<configuration>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
            pattern>
        encoder>
    appender>

    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>D:/logs/quartz_task_application.logfile>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
            pattern>
        encoder>
    appender>

    <root level="debug">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
    root>

configuration>

タスクの作成(コールバックパラメータ付き)
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HelloJob implements Job {

    Logger logger = LoggerFactory.getLogger(this.getClass());

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        //     
        JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
        //       ,    
        String taskId = jobDataMap.getString("taskId");

        //             、  
        this.logger.debug(this.getClass().getName() + " trigger..." + taskId);
    }

}

単純タイミングタスクの作成
import java.util.concurrent.TimeUnit;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class BootstrapSimple {
    private static Logger logger = LoggerFactory.getLogger(BootstrapSimple.class);

    public static void main(String[] args) {

        try {
            //   Scheduler  
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

            //     
            JobDetail job = JobBuilder.newJob(HelloJob.class).withIdentity("job1", "group1").build();
            //         ,       ,        ,       
            job.getJobDataMap().put("taskId", "I am Hello Job ...");

            //      
            SimpleScheduleBuilder simpleScheduleBuilder = SimpleScheduleBuilder.simpleSchedule()//
                    .withIntervalInSeconds(5)//
                    .repeatForever();//
            Trigger trigger = TriggerBuilder.newTrigger()//
                    .withIdentity("trigger1", "group1")//
                    .withSchedule(simpleScheduleBuilder).build();//

            //   Scheduler    
            scheduler.scheduleJob(job, trigger);

            //      
            scheduler.start();

            /*        ,        3         (       “  Scheduler”) */
            try {
                TimeUnit.MINUTES.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            //   Scheduler
            scheduler.shutdown();

        } catch (SchedulerException se) {
            logger.error(se.getMessage(), se);
        }
    }

}

よく使われるCron Schedule
import java.util.concurrent.TimeUnit;

import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class BootstrapCorn {
    private static Logger logger = LoggerFactory.getLogger(BootstrapCorn.class);

    public static void main(String[] args) {

        try {
            //   Scheduler  
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

            //     
            JobDetail job = JobBuilder.newJob(HelloJob.class)//
                    .withIdentity("job1", "group1").build();
            //    ,          ,       
            job.getJobDataMap().put("taskId", "I am Hello Job ...");

            //       
            CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/2 * * * * ?");
            Trigger trigger = TriggerBuilder.newTrigger()//
                    .withIdentity("trigger1", "group1")//
                    .withSchedule(cronScheduleBuilder).build();//

            //   Scheduler    
            scheduler.scheduleJob(job, trigger);

            //      
            scheduler.start();

            /*        ,        3         (       “  Scheduler”) */
            try {
                TimeUnit.MINUTES.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            //   Scheduler
            scheduler.shutdown();

        } catch (SchedulerException se) {
            logger.error(se.getMessage(), se);
        }
    }

}

WebアプリケーションでのQuartzの使用
QuartzはWebアプリケーションでもよく使われ、Springによって管理される形式が一般的ですが、ここではこれを紹介しません.ここではQuartzがWebアプリケーションで単独で使用されていることを紹介します.
一般的に、Webアプリケーションの起動時には、決定されたタイミングタスクを登録する必要があります.トリガ時間が決定されていないダイナミックなタイミングタスクの一部は、その後、静的Schedulerによって登録することができます. , web.xml (>_
、Java , 。
タイミングタスクリスナー(タイミングタスクの登録用)
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import No01       .HelloJob;

/**
 * Application Lifecycle Listener implementation class AListener
 *
 */
public class ApplicationContextListener implements ServletContextListener {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    public static Scheduler scheduler = null;

    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        this.logger.info("The application start...");

        /*        */
        try {
            //   Scheduler  
            scheduler = StdSchedulerFactory.getDefaultScheduler();
            scheduler.start();

            //     
            JobDetail job = JobBuilder.newJob(HelloJob.class).withIdentity("job1", "group1").build();

            //      
            SimpleScheduleBuilder simpleScheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
                    .withIntervalInSeconds(5).repeatForever();
            Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")
                    .startNow().withSchedule(simpleScheduleBuilder).build();

            //   Scheduler    
            scheduler.scheduleJob(job, trigger);

            this.logger.info("The scheduler register...");
        } catch (SchedulerException se) {
            logger.error(se.getMessage(), se);
        }
    }

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        this.logger.info("The application stop...");

        /*        */
        try {
            //   Scheduler
            scheduler.shutdown();

            this.logger.info("The scheduler shutdown...");
        } catch (SchedulerException se) {
            logger.error(se.getMessage(), se);
        }
    }

}

Web.xmlにカスタムリスナーを追加
<listener>
  <listener-class>myuartz.ApplicationContextListenerlistener-class>
listener>

参考のブログアドレス
http://www.cnblogs.com/nick-huang/p/4848843.html#_label0