【Java】定时任务Quartz

来源:互联网 发布:macvim python 配置 编辑:程序博客网 时间:2024/06/15 04:00

前言

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的参数中获取
  • 多个任务时,任务名称不能相同,否则会报错

附加

本文只是将配置流程说明一下,具体配置内容请参考这里

原创粉丝点击