前言
Java小白一个,最近查看项目中关于定时器的源码,尝试自己配置了一下。文件参考
jar包
这是在定时器实现中使用到的jar包
- c3p0-0.9.1.1.jar
- jta.jar
- log4j-1.2.16.jar
- quartz-2.2.2.jar
- quartz-jobs-2.2.2.jar
- slf4j-api-1.7.7.jar
- slf4j-log4j12-1.7.7.jar
环境
- 1.7 JDK
- spring框架
Web.xml
首先在Web.xml中配置属性
<servlet>
<servlet-name>QuartzInitializer</servlet-name>
<display-name>Quartz Initializer Servlet</display-name>
<servlet-class>
org.quartz.ee.servlet.QuartzInitializerServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
<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>
</servlet>
制定quartz配置文件所在的路径
quartz.properties
在项目的src目录下配置quartz.properties文件,这里面是Quartz的配置
#===============================================================
#Configure Main Scheduler Properties
#===============================================================
org.quartz.scheduler.instanceName = QuartzScheduler
org.quartz.scheduler.instanceId = AUTO
#===============================================================
#Configure ThreadPool
#===============================================================
org.quartz.threadPool.threadCount = 20
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
#===============================================================
#Configure JobStore
#===============================================================
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
#===============================================================
#Configure Plugins
#===============================================================
org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin
org.quartz.plugin.jobInitializer.fileNames = quartz_jobs.xml
org.quartz.plugin.jobInitializer.failOnFileNotFound = true
在下载的quartz的jar包中包含它的原始配置问价,需要修改为我们自己需要的属性。这里加了plugins的配置,quartz_jobs.xml文件将配置需要执行的定时任务。
quartz_jobs.xml
在这里配置定时任务,需要制定定时任务执行的类、执行时间等信息。
<?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>ShowDateJob</name>
<group>task</group>
<job-class>com.swl.timer.ShowDate</job-class>
</job>
<trigger>
<cron>
<name>ShowDateCon</name>
<group>task</group>
<job-name>ShowDateJob</job-name>
<job-group>task</job-group>
<cron-expression>1 * * * * ?</cron-expression>
</cron>
</trigger>
</schedule>
</job-scheduling-data>
要注意每个都与一个相关联,定义任务的名称、任务组、执行类,定义触发器触发的时间。如果需要配置多个定时任务,只需要在schedule中添加额外的与即可
执行类
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class ShowName implements Job{
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
// TODO Auto-generated method stub
if(arg0 != null){
System.out.println(arg0);
}
System.out.println("test task");
}
}
每个执行类都是继承org.quartz.Job类,用户需要实现execute接口,这里面是需要执行的逻辑代码。这个接口有个参数arg0,当用户主动调用定时任务时,可以进行传参。
主动调用
@RequestMapping("/home/runjob.htm")
public void runjob(HttpServletRequest request, HttpServletResponse response) throws IOException, SchedulerException{
ServletContext ctx = request.getSession().getServletContext();
StdSchedulerFactory factory = (StdSchedulerFactory) ctx.getAttribute("org.quartz.impl.StdSchedulerFactory.KEY");
Scheduler scheduler = factory.getScheduler();
JobDetail jd = JobBuilder.newJob(ShowName.class).withIdentity("shownamejob_s","temporary_task_s")
.storeDurably().build();
// jd.getJobDataMap().put("params", params);
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("shownamejob", "temporary_task")//.withSchedule(SimpleScheduleBuilder.simpleSchedule().withMisfireHandlingInstructionFireNow())
.startNow()
.build();
scheduler.scheduleJob(jd,trigger);
}
- 从Quartz1.5开始,QuartzInitializerServlet将自动储存StdSchedulerFactory实例在ServletContext里
- JobDataMap可以储存定时任务的参数,这个值可以在execute的参数中获取
- 多个任务时,任务名称不能相同,否则会报错
附加
本文只是将配置流程说明一下,具体配置内容请参考这里