Spring与Quartz的整合实现定时任务调度

【基本概念】


       参考博客: 

       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时触发.­


 小结:

     上面的这几个例子一般够用了,如果没有你需要的时间点或者想详细的了解这种规则,可以再去查。

           

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值