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も導入されています(詳細なログを見るためですか!)
シンプルな構築
JArパッケージの導入は、上記のpomファイルを参照してください.さらに
logback.xml、ログフレームワークlogbackの構成.ここではコンソールとログファイルの出力のみを簡単に構成していますよ(>
タスクの作成(コールバックパラメータ付き)
単純タイミングタスクの作成
よく使われるCron Schedule
WebアプリケーションでのQuartzの使用
QuartzはWebアプリケーションでもよく使われ、Springによって管理される形式が一般的ですが、ここではこれを紹介しません.ここではQuartzがWebアプリケーションで単独で使用されていることを紹介します.
一般的に、Webアプリケーションの起動時には、決定されたタイミングタスクを登録する必要があります.トリガ時間が決定されていないダイナミックなタイミングタスクの一部は、その後、静的Schedulerによって登録することができます.
Web.xmlにカスタムリスナーを追加
参考のブログアドレス
参考になる優秀な資料
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