【Java】定时任务Quartz
2017-09-22 15:09
253 查看
前言
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 JDKspring框架
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的参数中获取
多个任务时,任务名称不能相同,否则会报错
附加
本文只是将配置流程说明一下,具体配置内容请参考这里相关文章推荐
- Java问题:Quartz,Hibernate,Spring,Tomcat中定时任务无故停止,没有错误
- Java Quartz 构建定时调度任务
- java定时任务Timer,Quartz
- Java之旅--定时任务(Timer、Quartz、Spring、LinuxCron)
- Java定时任务之Quartz
- [JAVA]定时任务之-Quartz使用篇
- Quartz实现定时任务的配置方法(纯java作业调度框架)
- Java作业调度/定时任务 Spring和Quartz整合
- Java quartz 定时任务
- [译]Java定时任务调度-Quartz文档(十二)Miscellaneous Features of Quartz
- Java spring quartz 定时任务
- java Quartz定时器任务与Spring task定时的几种实现方法
- 关于Java Web 使用Spring中使用Quartz(定时调用、实现固定时间执行), 触发定时器(执行某些任务)的实例
- [JAVA]定时任务之-Quartz使用篇
- [JAVA]定时任务之-Quartz使用篇
- [JAVA]定时任务之-Quartz使用篇
- java中定时任务 quartz 时间配置规则
- JAVA 中 用quartz 完成定时任务的相关配置
- java 定时任务 (timer和timetask,quartz,spring,LinuxCron)
- [JAVA]定时任务之-Quartz使用篇