【基本概念】
参考博客:
1、http://blog.51cto.com/lavasoft/181907
2、http://blog.csdn.net/guolong1983811/article/details/51501346
3、http://www.yiibai.com/quartz/
4、官网地址:http://www.quartz-scheduler.org/
♦Quartz是什么?
Quartz是一种功能丰富的,开放源码的作业调度库,可以在几乎任何java应用程序集成,从最小的独立的应用程序到规模最大的电子商务系统。Quartz可以用来创建简单或复杂的日程安排执行几十,几百,甚至十万的作业书,作业被定义为标准的java组件,可以执行几乎任何东西,可以编程让他们执行。
♦应用场景
定时去执行某个方法,比如,定时更新静态数据,定时执行发送消息等。
♦核心概念
Job:
表示一个工作,要执行的具体内容。此接口中只有一个方法。void execute(JobExecutionContext context)
JobDetail:
表示一个具体的课执行的调度程序,Job是这个可执行调度程序所要执行的内容,另外JobDetail包含了这个任务调度的方案和策略。
Trigger:
代表了一个调度参数的配置,什么时候去调。
整个过程:
Scheduler可以将Trigger绑定到某一JobDetail中,这样当Trigger触发时,对应的Job就被执行。一个Job可以对应多个Trigger,但一个Trigger只能对应一个Job。可以通过SchedulerFactory创建一个Scheduler实例。Scheduler拥有一个SchedulerContext,它类似于ServletContext,保存着Scheduler上下文信息,Job和Trigger都可以访问SchedulerContext内的信息。SchedulerContext内部通过一个Map,以键值对的方式维护这些上下文数据,SchedulerContext为保存和获取数据提供了多个put()和getXxx()的方法。可以通过Scheduler# getContext()获取对应的SchedulerContext实例
【Spring结合Quartz实例代码】
1、配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
<!-- 配置调度器工厂(SchedulerFactoryBean) --> 第四点:把Trigger放到调度工厂(schedule)中,等待调度
<bean name="startQuertz"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="myJobTrigger" />
<ref bean="myJobTrigger1" />
<ref bean="myWorkTrigger" />
</list>
</property>
</bean>
<!-- 配置Cron触发器(CronTriggerFactoryBean) 巡检站点任务 -->
<bean id="myJobTrigger1"
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail">
<ref bean="myJobDetail1" />
</property>
<property name="cronExpression">
<!-- 每隔1分钟执行一次 -->
<value>0 0 0 * * ?</value>
</property>
</bean>
<!-- 配置方法调用任务工厂 -->
<bean id="myJobDetail1"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="myJob" />
</property>
<property name="targetMethod">
<value>Inspection</value>
</property>
</bean>
<!-- 配置Cron触发器(CronTriggerFactoryBean)-->
<bean id="myJobTrigger"
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail">
<ref bean="myJobDetail" />
</property>
<property name="cronExpression">
<!-- 每隔1分钟执行一次 -->
<value>0 */01 * * * ?</value>
</property>
</bean>
<!-- 配置Cron触发器(CronTriggerFactoryBean)--> 第三点:Trigger,什么时候执行
<bean id="myWorkTrigger"
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail">
<ref bean="myWorkDetail" />
</property>
<property name="cronExpression">
<!-- 每天晚上11点50执行一次 -->
<value>0 50 23 * * ? *</value>
</property>
</bean>
<!-- 配置方法调用任务工厂 -->
<bean id="myJobDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="myJob" />
</property>
<property name="targetMethod">
<value>myTest</value>
</property>
</bean>
<!-- 配置方法调用考勤表填入 --> 第二点: 指定要执行那个方法 jobDetail
<bean id="myWorkDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="myJob" />
</property>
<property name="targetMethod">
<value>addWorkAttendence</value>
</property>
</bean>
<!-- 配置自定义的时间任务(Job) --> 第一个点:指定job在哪(要执行的代码在哪)
<bean id="myJob" class="com.cn.zhongcai.timing.task" />
</beans>
上述代码中标明了新建一个调度的四部。
2、task类:
package com.cn.zhongcai.timing;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.cn.zhongcai.service.InspectionTaskService;
import com.cn.zhongcai.service.MessageDetailService;
import com.cn.zhongcai.service.QuestionnaireModelService;
import com.cn.zhongcai.service.SiteTaskService;
import com.cn.zhongcai.util.BaseUtil;
/**
* 任务定时
*
* @author gzz
*
*/
@Component
public class task {
@Autowired
private InspectionTaskService taskService;
@Autowired
private QuestionnaireModelService modelService;
@Autowired
private SiteTaskService sitetaskservice;
@Autowired
private MessageDetailService messageService;
//站点-管理员-发布任务
public void myTest(){
//站点任务-管理员任务
boolean flag = sitetaskservice.timingEnd(BaseUtil.getCurrentTime());
taskService.scanningInspectionexport();//巡检任务定时发布
modelService.Automatic_Release();//问卷调查
messageService.MessageDetailTime();//消息管理
if(flag){
System.out.println("站点任务,管理员任务,巡检任务,问卷调查,消息定时执行成功");
}else{
System.out.println("站点任务,管理员任务,巡检任务,问卷调查,消息定时执行");
}
}
//如果今天未打卡,则往打卡表里添加一个数据,只填入当天时间
public void addWorkAttendence(){
System.out.println("考勤定时任务执行");
}
// 巡检任务定时发布
public void Inspection() {
// System.out.println("巡检站点任务");
// taskService.scanningInspectionexport();
}
//问卷调查定时发布
public void QuestionnaireModel(){
// System.out.println("456");
// modelService.Automatic_Release();
}
}
3、 其中什么时候执行,时间的填写规则:
CronExpression表达式解释:
0 0 12 * * ?---------------在每天中午12:00触发
0 15 10 ? * *---------------每天上午10:15 触发
0 15 10 * * ?---------------每天上午10:15 触发
0 15 10 * * ? *---------------每天上午10:15 触发
0 15 10 * * ? 2005---------------在2005年中的每天上午10:15 触发
0 * 14 * * ?---------------每天在下午2:00至2:59之间每分钟触发一次
0 0/5 14 * * ?---------------每天在下午2:00至2:59之间每5分钟触发一次
0 0/5 14,18 * * ?---------------每天在下午2:00至2:59和6:00至6:59之间的每5分钟触发一次
0 0-5 14 * * ?---------------每天在下午2:00至2:05之间每分钟触发一次
0 10,44 14 ? 3 WED---------------每三月份的星期三在下午2:00和2:44时触发
0 15 10 ? * MON-FRI---------------从星期一至星期五的每天上午10:15触发
0 15 10 15 * ?---------------在每个月的每15天的上午10:15触发
0 15 10 L * ?---------------在每个月的最后一天的上午10:15触发
0 15 10 ? * 6L---------------在每个月的最后一个星期五的上午10:15触发
0 15 10 ? * 6L 2002-2005---------------在2002, 2003, 2004 and 2005年的每个月的最后一个星期五的上午10:15触发
0 15 10 ? * 6#3---------------在每个月的第三个星期五的上午10:15触发
0 0 12 1/5 * ?---------------从每月的第一天起每过5天的中午12:00时触发
0 11 11 11 11 ?---------------在每个11月11日的上午11:11时触发.
小结:
上面的这几个例子一般够用了,如果没有你需要的时间点或者想详细的了解这种规则,可以再去查。