因项目需要,需要在Web App中定期执行某Java程序。在Google上搜索发现了Quartz。
创建一个Job
第一步需要创建一个Job实现org.quartz.Job接口的execute方法。每次scheduler到点调用的就是这个程序。
package com.enix.dataxfer.scheduler;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import com.enix.dataxfer.jython.Transfer;
@DisallowConcurrentExecution
public class TransferJob implements Job{
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("Transfer job is started...");
Transfer.batch();
System.out.println("Transfer job is ended...");
}
}
2. 创建配置文件quartz.properties
配置文件quartz.properties需要放在WEB-INF/classes下,此处需要注意的是,
org.quartz.plugin.joinInitializer.fileName 指定步骤一创建的job的cron trigger信息,也就是说该Job多久运行一次。
jobs.xml也需要放在WEB-INF/classes文件夹下。
org.quartz.scheduler.instanceName = MyScheduler
org.quartz.threadPool.threadCount = 1
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin
org.quartz.plugin.jobInitializer.fileNames = jobs.xml
org.quartz.plugin.jobInitializer.failOnFileNotFound = true
org.quartz.plugin.jobInitializer.scanInterval = 10
org.quartz.plugin.jobInitializer.wrapInUserTransaction = false
3. 创建jobs.xml定义步骤1创建的TransferJob
此处定义了一个cron trigger,从0:00开始,每隔5分钟触发一次TransferJob。对应的语法,大家可以参看Quartz的官网
<?xml version="1.0" encoding="UTF-8"?>
<job-scheduling-data
xmlns="http://www.quartz-scheduler.org/xml/JobSchedulingData"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.quartz-scheduler.org/xml/JobSchedulingData http://www.quartz-scheduler.org/xml/job_scheduling_data_1_8.xsd"
version="1.8">
<schedule>
<job>
<name>TransferJob</name>
<group>DataBatchJobs</group>
<description>Trigger the data migration script</description>
<job-class>com.enix.dataxfer.scheduler.TransferJob</job-class>
</job>
<trigger>
<cron>
<name>TransferTrigger</name>
<job-name>TransferJob</job-name>
<job-group>DataBatchJobs</job-group>
<!-- 从0:00开始,每隔5分钟触发一次 -->
<!-- Good morning guy... -->
<cron-expression>0 0/5 0-23 * * ?</cron-expression>
</cron>
</trigger>
</schedule>
</job-scheduling-data>
4. 添加Listener到web.xml
最后一步,也就是要添加Quartz的listener到web.xml,这样JBOSS就会注册该listener,而定期执行任务。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<!-- Quartz scheduler listener -->
<listener>
<listener-class>org.quartz.ee.servlet.QuartzInitializerListener</listener-class>
</listener>
<!-- JFinal framework -->
<filter>
<filter-name>jfinal</filter-name>
<filter-class>com.jfinal.core.JFinalFilter</filter-class>
<init-param>
<param-name>configClass</param-name>
<param-value>com.enix.dataxfer.core.AppConfig</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>jfinal</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
5. 部署程序,并查看运行日志
17:40:00,001 INFO [stdout] (MyScheduler_Worker-1) Transfer job is started...
17:40:01,360 INFO [stdout] (MyScheduler_Worker-1) Transfer job is ended...
17:45:00,002 INFO [stdout] (MyScheduler_Worker-1) Transfer job is started...
17:45:01,367 INFO [stdout] (MyScheduler_Worker-1) Transfer job is ended...
17:55:00,001 INFO [stdout] (MyScheduler_Worker-1) Transfer job is started...
17:55:01,340 INFO [stdout] (MyScheduler_Worker-1) Transfer job is ended...