Quartz是OpenSymphony开源组织在Job scheduling领域一个开源项目之一,它可以与J2EE与J2SE应用程序相结合也可以单独使用。
该项目主页:http://www.opensymphony.com/quartz
这里记录的是在一个单纯的web工程中的简单使用方法(只是个拷贝文件目录的例子)
新建的工程如图所示
第一步:导入quartz的jar包及其他想关的包(jta.jar需要导入,否则运行会有异常[java.lang.NoClassDefFoundError: javax/transaction/UserTransaction],log4j是记录日志的包;另外两common包是由于在工程中使用的是xml文件定义定时任务,所有需要)
第二步:修改web.xml,增加quartz配置信息,使得web工程启动时候能够初始化quartz信息,添加如下信息:
<!-- Quartz 配置信息 -->
<servlet>
<display-name>Quartz Initializer Servlet</display-name>
<servlet-name>QuartzInitializer</servlet-name>
<servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class>
<init-param>
<param-name> config-file</param-name>
<param-value> /quartz.properties</param-value>
</init-param>
<init-param>
<param-name>shutdown-on-unload</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>start-scheduler-on-load</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
第三步:在src目录下添加quartz的属性文件(quartz.properties)和任务定义文件(quartz_job.xml)以及log4j日志文件
quartz.properties
org.quartz.scheduler.instanceName = FilesyncScheduler
org.quartz.scheduler.instanceId = one
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 3
org.quartz.threadPool.threadPriority = 4
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin
org.quartz.plugin.jobInitializer.fileName = quartz_job.xml
org.quartz.plugin.jobInitializer.overWriteExistingJobs = true
org.quartz.plugin.jobInitializer.failOnFileNotFound = true
org.quartz.plugin.jobInitializer.scanInterval = 10
org.quartz.plugin.shutdownhook.class = org.quartz.plugins.management.ShutdownHookPlugin
org.quartz.plugin.shutdownhook.cleanShutdown = true
quartz_job.xml
<?xml version="1.0" encoding="UTF-8"?>
<quartz xmlns="http://www.opensymphony.com/quartz/JobSchedulingData"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.opensymphony.com/quartz/JobSchedulingData
http://www.opensymphony.com/quartz/xml/job_scheduling_data_1_5.xsd"
version="1.5">
<job>
<job-detail>
<name>FileSyncJob</name>
<group>FileGroup</group>
<job-class>com.go.task.FileCopyJob</job-class>
<job-data-map allows-transient-data="true">
<entry>
<key>command</key>
<value>xcopy D://work//XMLData c://Media /s</value>
</entry>
</job-data-map>
</job-detail>
<trigger>
<cron>
<name>trigger1</name>
<group>triggerGroup1</group>
<job-name>FileSyncJob</job-name>
<job-group>FileGroup</job-group>
<cron-expression>0 0 * ? * MON-FRI</cron-expression>
</cron>
</trigger>
</job>
</quartz>
log4j.properties
log4j.rootCategory=INFO,stdout,fileout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%d LV:%5p CL:%c%t] %m%n
#log4j.appender.fileout.encoding=UTF-8
log4j.appender.fileout=org.apache.log4j.RollingFileAppender
log4j.appender.fileout.File=D/://workarea//log.log
log4j.appender.fileout.MaxFileSize=5MB
log4j.appender.fileout.MaxBackupIndex=100
log4j.appender.fileout.Append=true
log4j.appender.fileout.layout=org.apache.log4j.PatternLayout
log4j.appender.fileout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p [%C.%M():%L] %m%n
第四步:定义拷贝文件任务的类,需要实现org.quartz.Job接口并实现execute方法,该方法为任务执行时执行的方法。
FileCopyJob.java
package com.go.task;
import java.io.IOException;
import java.util.Date;
import org.apache.log4j.Logger;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class FileCopyJob implements Job {
Logger logger = Logger.getLogger(FileCopyJob.class);
public void execute(JobExecutionContext context)
throws JobExecutionException {
JobDataMap jobDataMap=context.getMergedJobDataMap();
String command=jobDataMap.getString("command");
try {
Runtime.getRuntime().exec(command);
} catch (IOException e) {
logger.error(e);
}
logger.info(new Date()+" 任务执行中 "+command);
}
}