您的位置:首页 > 编程语言 > Java开发

【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 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的参数中获取

多个任务时,任务名称不能相同,否则会报错

附加

本文只是将配置流程说明一下,具体配置内容请参考这里
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  定时任务 spring quartz