Spring整合quartz两种方式以及Spring轮询定时使用

原文地址,转载请注明出处:http://blog.csdn.net/qq_34021712/article/details/71728002    ©王赛超

前提条件
<dependency>
	<groupId>org.quartz-scheduler</groupId>
	<artifactId>quartz</artifactId>
	<version>2.2.2</version>
</dependency>
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context-support</artifactId>
	<version>4.1.3.RELEASE</version>
</dependency>
使用方法分为MethodInvokingJobDetailFactoryBean方式和JobDetailBean方式,推荐使用第一种: 完整项目下载
第一种方法:MethodInvokingJobDetailFactoryBean
第一步:编写一个普通的java类,类中随便写几个方法
package com.quartz.component;


import org.springframework.beans.factory.annotation.Autowired;


import com.quartz.Student;
import com.quartz.mapper.StudentMapper;


public class QuartzAutoTask {
	
	@Autowired
	private StudentMapper studentMapper;


	public void eat(){
		System.out.println("5秒吃饭");
	}
	
	public void sleep(){
		int insert = studentMapper.insert(new Student(null, "张三", 18, "男"));
		System.out.println(insert);
	}
}
第二步:applicationContext-quartz.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
	http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
    
    
    <!--作业的具体实现    -->    
    <bean id="autoTask" class="com.quartz.component.QuartzAutoTask" />    
    
     <!-- task -->    
    <!-- 定义了一个任务JobDetail -->    
    <bean id="quartzEat" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">    
    	<!-- 指定要执行的类 -->
        <property name="targetObject" ref="autoTask" />    
        <!-- 指定执行的方法 -->
         <property name="targetMethod" value="eat" />    
    </bean>    
        
    <bean id="quartzSleep" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">    
    	<!-- 指定要执行的类 -->
        <property name="targetObject" ref="autoTask" />    
        <!-- 指定执行的方法 -->
         <property name="targetMethod" value="sleep" />    
    </bean>    
    
    <!-- 调度定时任务 的触发器-->    
    <!-- 这种配置可以精确几点执行定时任务 -->    
    <bean id="cronQuartzEat" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">    
        <property name="jobDetail">    
            <ref bean="quartzEat"></ref>    
        </property>    
        <property name="cronExpression">  
        	<!--每隔5秒触发一次  -->  
            <value>*/5 * * * * ?</value>    
        </property>    
    </bean>    
        
    <bean id="cronQuartzSleep" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">    
        <property name="jobDetail">    
            <ref bean="quartzSleep"></ref>    
        </property>    
        <property name="cronExpression">    
            <!--每隔10秒触发一次  -->  
            <value>*/10 * * * * ?</value>  
        </property>    
    </bean>    
    
    <!--启动定时任务的调度器,注意这里的ref bean -->    
    <bean id="schedulerFactoryBean" lazy-init="false" autowire="no"    
        class="org.springframework.scheduling.quartz.SchedulerFactoryBean">    
        <property name="triggers">    
            <list>    
                <ref bean="cronQuartzEat"></ref>    
                <ref bean="cronQuartzSleep"></ref>    
            </list>    
        </property>    
    </bean>    
</beans> 
第三步:在web.xml中添加扫描applicationContext-quartz.xml
<!-- 加载spring容器 -->
<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>classpath:spring/applicationContext-*.xml</param-value>
</context-param>
<listener>
	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
第二种方法:JobDetailBean方式
第一步:编写一个普通的java类继承QuartzJobBean
package com.quartz.component;


import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.quartz.QuartzJobBean;


import com.quartz.Student;
import com.quartz.mapper.StudentMapper;


public class QuartzDetail extends QuartzJobBean {
	
	@Override
	protected void executeInternal(JobExecutionContext context)
			throws JobExecutionException {
		System.out.println("开始执行。。。");
		//无法使用注解注入Bean,所以在配置文件中注入spring上下文,然后使用JobExecutionContext获得
		ApplicationContext applicationContext = (ApplicationContext)context.getJobDetail().getJobDataMap().get("applicationContext");
		StudentMapper studentMapper= (StudentMapper) applicationContext.getBean("studentMapper");
		int insert = studentMapper.insert(new Student(null, "李四", 20, "男"));
		System.out.println(insert);
	}


}
第二步:applicationContext-quartz.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
	http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
    
    <!-- 定义JobDetail的Bean -->
    <bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">    
            <!-- 指定任务Bean的实现类 -->    
            <property name="jobClass" value="com.quartz.component.QuartzDetail"/>    
            <!-- 指定job的名称 -->
            <property name="name" value="myJob"/>
            <!-- 指定job的分组 -->
            <property name="group" value="jobs"/>
            <!-- 必须设置为true,如果为false 当没有活动的触发器与之关联时会在调度器中删除该任务 -->
            <property name="durability" value="true"/>
            <!-- 测试是无法注入spring的Bean 所以注入spring上下文 -->    
            <property name="applicationContextJobDataKey" value="applicationContext"/>
     </bean>  
    
    <!-- 定义触发器的Bean -->
    <bean id="quartzDetail" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
		    <!-- 指定jobDetail -->    
		    <property name="jobDetail" ref="jobDetail"/>    
		    <!-- 指定Cron表达式:每10秒执行一次 -->    
		    <property name="cronExpression" value="*/10 * * * * ?"/>    
	</bean>    
<!-- 执行实际的调度器-->    
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">    
    <property name="triggers">    
        <list>    
            <ref bean="quartzDetail"/>    
        </list>    
    </property>    
</bean>
    
</beans> 
第三步:在web.xml中添加扫描applicationContext-quartz.xml
<!-- 加载spring容器 -->
<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>classpath:spring/applicationContext-*.xml</param-value>
</context-param>
<listener>
	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
Spring轮询的配置使用
第一步:写一个类,给Spring管理,类上标注@Service
package com.quartz.service;


import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;


@Service
public class StudentServiceImpl {


	@Scheduled(cron="*/1 * * * * ?")
	public void execute(){
		System.out.println("执行了。。。。。。");
	}
}

第二步:在spring.xml上添加头信息


<?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" 
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" 
    xmlns:task="http://www.springframework.org/schema/task"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans-4.1.xsd 
            http://www.springframework.org/schema/mvc 
            http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd 
            http://www.springframework.org/schema/context 
            http://www.springframework.org/schema/context/spring-context-4.1.xsd 
            http://www.springframework.org/schema/aop 
            http://www.springframework.org/schema/aop/spring-aop-4.1.xsd 
            http://www.springframework.org/schema/tx 
            http://www.springframework.org/schema/tx/spring-tx-4.1.xsd 
            http://www.springframework.org/schema/task
  			http://www.springframework.org/schema/task/spring-task-4.1.xsd">
第三步:在spring.xml中添加以下注解
<!-- 任务发送  -->
<task:annotation-driven />




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值