spring的三种任务调度实现方式

基本概念 
任务(job):需要被调度以指定的时间间隔运行的任务单元。 
触发器(trigger):引发任务运行的条件。 
调度计划(schedule):一个任务和用来管理这个任务的一组触发器的集合。 

通常一个任务在他的调度计划中只有一个触发器,所以触发器和调度计划这两个概念通常可以互换。 

第一种:Spring对JDK Timer调度的支持 
目的:许多任务需要配置数据,采用spring管理,使得程序易于配置。 
触发器信息是硬编码到程序里的,意味着对任务触发时间的修改都要修改程序并重新编译。 
调度新任务或移除任务都需要修改程序代码,这可以通过spring来配置。 

核心类: 
ScheduleTimerTask: 扮演TimerTask的包装器实现,允许你为这个任务定义触发器信息。 
TimerFactoryBean:让spring使用配置创建触发器,为一组指定的scheduledTimerTask bean自动创建Timer实例。 

实现:

1. 定义了任务类;

/*******************************************************************************
 * @(#)MyTask.java 2014-1-19
 *
 * Copyright 2014 juluce. All rights reserved.
 *******************************************************************************/
package com.juluce.schedule.timer;

/**
 * <b>Application name:</b> MyTask.java <br>
 * <b>Application describing: </b> <br>
 * <b>Copyright:</b> Copyright © 2014 juluce 版权所有。<br>
 * <b>Company:</b> juluce <br>
 * <b>Date:</b> 2014-1-19 <br>
 * @author <a href="mailto:juluce133@sina.com"> juluce </a>
 * @version V1.0
 */
public class MyTask {
    private String name;

    public void run() {
        System.out.println("执行的任务是: " + name + ".");
    }

    /**
     * name的GET方法
     * @return String name.
     * @date: 2014-1-19
     * @author: juluce
     */
    public String getName() {
        return name;
    }

    /**
     * name的SET方法
     * @param name The name to set.
     * @date: 2014-1-19
     * @author: juluce
     */
    public void setName(String name) {
        this.name = name;
    }
}

2. 利用spring提供的MethodInvokingTimerTaskFactoryBean类来实现来实现对对task类和方法的声明,声明目标对象和方法,从而使spring知道要运行那个类的那个方法。 利用ScheduledTimerTask类来配置每个task的启动时间延时,每次启动之间的间隔,当然还有最重要的是需要运行那个对象,这里使用的上面提到的MethodInvokingTimerTaskFactoryBean类的实例;

<?xml version="1.0" encoding="GBK"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	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-3.0.xsd"
	default-lazy-init="true">
	<bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean"
		lazy-init="false">
		<property name="scheduledTimerTasks">
			<list>
				<ref local="scheduledTask1" />
				<ref local="scheduledTask2" />
			</list>
		</property>
	</bean>

	<bean id="scheduledTask1" class="org.springframework.scheduling.timer.ScheduledTimerTask">
		<property name="delay" value="0" />
		<property name="period" value="10000" />
		<property name="timerTask">
			<ref bean="methodInvokingTask1" />
		</property>
	</bean>

	<bean id="scheduledTask2" class="org.springframework.scheduling.timer.ScheduledTimerTask">
		<property name="delay" value="0" />
		<property name="period" value="10000" />
		<property name="timerTask">
			<ref bean="methodInvokingTask2" />
		</property>
	</bean>

	<bean id="methodInvokingTask1"
		class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">
		<property name="targetObject" ref="myTask1" />
		<property name="targetMethod" value="run" />
	</bean>

	<bean id="methodInvokingTask2"
		class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">
		<property name="targetObject" ref="myTask2" />
		<property name="targetMethod" value="run" />
	</bean>

	<bean id="myTask1" class="com.juluce.schedule.timer.MyTask">
		<property name="name" value="task1" />
	</bean>

	<bean id="myTask2" class="com.juluce.schedule.timer.MyTask">
		<property name="name" value="task2" />
	</bean>
</beans>

3.  最后定义了一个测试类,并且把ScheduledTimerTask类的实例作为需要调度的task;

/*******************************************************************************
 * @(#)Test.java 2014-1-19
 *
 * Copyright 2014 juluce. All rights reserved.
 *******************************************************************************/
package com.juluce.schedule.timer;

import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * <b>Application name:</b> Test.java <br>
 * <b>Application describing: </b> <br>
 * <b>Copyright:</b> Copyright © 2014 juluce 版权所有。<br>
 * <b>Company:</b> juluce <br>
 * <b>Date:</b> 2014-1-19 <br>
 * @author <a href="mailto:juluce133@sina.com"> juluce </a>
 * @version V1.0
 */
public class Test {
    public static void main(String[] args) {
        new ClassPathXmlApplicationContext("com/juluce/schedule/timer/spring.xml");
    }
}

第二种:Spring任务调度Quartz simple trigger

实现

1 首先,需要定义了一个Task类,具体的任务逻辑可以写在这个类里;

/*******************************************************************************
 * @(#)MyTask.java 2014-1-19
 *
 * Copyright 2014 juluce. All rights reserved.
 *******************************************************************************/
package com.juluce.schedule.quartz;

/**
 * <b>Application name:</b> MyTask.java <br>
 * <b>Application describing: </b> <br>
 * <b>Copyright:</b> Copyright © 2014 juluce 版权所有。<br>
 * <b>Company:</b> juluce <br>
 * <b>Date:</b> 2014-1-19 <br>
 * @author <a href="mailto:juluce133@sina.com"> juluce </a>
 * @version V1.0
 */
public class MyTask {
    private String name;

    public void run() {
        System.out.println("执行的任务是: " + name + ".");
    }

    /**
     * name的GET方法
     * @return String name.
     * @date: 2014-1-19
     * @author: juluce
     */
    public String getName() {
        return name;
    }

    /**
     * name的SET方法
     * @param name The name to set.
     * @date: 2014-1-19
     * @author: juluce
     */
    public void setName(String name) {
        this.name = name;
    }
}

2 定义一个JobDetailBean类的bean,这个是为了适应Quartz的JobDetail,其中可以定义name,group,description等信息,这些信息主要是为了和别的作业做区分使用;其中还有一个jobClass属性,定义了使用的是那个Job类实例,这里使用第二步创建的MyJob类;最后定义了一个叫jobDataAsMap的属性,这个属性是Quartz提供的用来传递参数使用的一个Map集合,这些集合里的类会被spring自动注入到目标Job类中;

/*******************************************************************************
 * @(#)MyJob.java 2014-1-19
 *
 * Copyright 2014 juluce. All rights reserved.
 *******************************************************************************/
package com.juluce.schedule.quartz;

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

/**
 * <b>Application name:</b> MyJob.java <br>
 * <b>Application describing: </b> <br>
 * <b>Copyright:</b> Copyright © 2014 juluce 版权所有。<br>
 * <b>Company:</b> juluce <br>
 * <b>Date:</b> 2014-1-19 <br>
 * @author <a href="mailto:juluce133@sina.com"> juluce </a>
 * @version V1.0
 */
public class MyJob extends QuartzJobBean {

    private MyTask myTask;

    /*
     * (non-Javadoc)
     * @see org.springframework.scheduling.quartz.QuartzJobBean#executeInternal(org.quartz.
     * JobExecutionContext)
     * @date: 2014-1-19
     * @author: juluce
     */
    @Override
    protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException {
        myTask.run();
    }

    /**
     * myTask的GET方法
     * @return MyTask myTask.
     * @date: 2014-1-19
     * @author: juluce
     */
    public MyTask getMyTask() {
        return myTask;
    }

    /**
     * myTask的SET方法
     * @param myTask The myTask to set.
     * @date: 2014-1-19
     * @author: juluce
     */
    public void setMyTask(MyTask myTask) {
        this.myTask = myTask;
    }
}

3 创建一个触发器类,这里使用的是Quartz提供的Simple Trigger,在Spring里,使用的是SimpleTriggerBean来做映射,主要是定义了第一次运行的延时时间,每次重复执行之间的间隔,当然还有最主要的具体的Job类实例;最后定义了一个SchedulerFactoryBean的bean,其中定义了具体要调度那些触发器;

<?xml version="1.0" encoding="GBK"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	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-3.0.xsd"
	default-lazy-init="true">
	<bean id="timerFactory"
		class="org.springframework.scheduling.quartz.SchedulerFactoryBean"
		lazy-init="false">
		<property name="triggers">
			<list>
				<ref local="simpleTrigger" />
			</list>
		</property>
	</bean>

	<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
		<property name="jobDetail" ref="myJob" />
		<property name="startDelay" value="0" />
		<property name="repeatInterval" value="10000" />
	</bean>

	<bean id="myJob" class="org.springframework.scheduling.quartz.JobDetailBean">
		<property name="name" value="myJob" />
		<property name="group" value="myGroup" />
		<property name="description" value="myJob" />
		<property name="jobClass"
			value="com.juluce.schedule.quartz.MyJob" />
		<property name="jobDataAsMap">
			<map>
				<entry key="myTask" value-ref="myTask" />
			</map>
		</property>
	</bean>

	<bean id="myTask" class="com.juluce.schedule.quartz.MyTask">
		<property name="name" value="my task" />
	</bean>
</beans>

4. 最后,写一个测试类来测试上面的代码和配置

/*******************************************************************************
 * @(#)Test.java 2014-1-19
 *
 * Copyright 2014 juluce. All rights reserved.
 *******************************************************************************/
package com.juluce.schedule.quartz;

import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * <b>Application name:</b> Test.java <br>
 * <b>Application describing: </b> <br>
 * <b>Copyright:</b> Copyright © 2014 juluce 版权所有。<br>
 * <b>Company:</b> juluce <br>
 * <b>Date:</b> 2014-1-19 <br>
 * @author <a href="mailto:juluce133@sina.com"> juluce </a>
 * @version V1.0
 */
public class Test {

    /**
     * {方法功能中文描述}
     * @param args
     * @author: juluce
     */
    public static void main(String[] args) {
        new ClassPathXmlApplicationContext("com/juluce/schedule/quartz/spring.xml");
    }
}

第三种:Spring任务调度Quartz Cron trigger

实现

1 首先,需要定义了一个Task类,具体的任务逻辑可以写在这个类里;

/*******************************************************************************
 * @(#)MyTask.java 2014-1-19
 *
 * Copyright 2014 juluce. All rights reserved.
 *******************************************************************************/
package com.juluce.schedule.quartz.trigger;

/**
 * <b>Application name:</b> MyTask.java <br>
 * <b>Application describing: </b> <br>
 * <b>Copyright:</b> Copyright © 2014 juluce 版权所有。<br>
 * <b>Company:</b> juluce <br>
 * <b>Date:</b> 2014-1-19 <br>
 * @author <a href="mailto:juluce133@sina.com"> juluce </a>
 * @version V1.0
 */
public class MyTask {
    private String name;

    public void run() {
        System.out.println("执行的任务是: " + name + ".");
    }

    /**
     * name的GET方法
     * @return String name.
     * @date: 2014-1-19
     * @author: juluce
     */
    public String getName() {
        return name;
    }

    /**
     * name的SET方法
     * @param name The name to set.
     * @date: 2014-1-19
     * @author: juluce
     */
    public void setName(String name) {
        this.name = name;
    }
}

2 定义一个JobDetailBean类的bean,这个是为了适应Quartz的JobDetail,其中可以定义name,group,description等信息,这些信息主要是为了和别的作业做区分使用;其中还有一个jobClass属性,定义了使用的是那个Job类实例,这里使用第二步创建的MyJob类;最后定义了一个叫jobDataAsMap的属性,这个属性是Quartz提供的用来传递参数使用的一个Map集合,这些集合里的类会被spring自动注入到目标Job类中;

/*******************************************************************************
 * @(#)MyJob.java 2014-1-19
 *
 * Copyright 2014 juluce. All rights reserved.
 *******************************************************************************/
package com.juluce.schedule.quartz.trigger;

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

/**
 * <b>Application name:</b> MyJob.java <br>
 * <b>Application describing: </b> <br>
 * <b>Copyright:</b> Copyright © 2014 juluce 版权所有。<br>
 * <b>Company:</b> juluce <br>
 * <b>Date:</b> 2014-1-19 <br>
 * @author <a href="mailto:juluce133@sina.com"> juluce </a>
 * @version V1.0
 */
public class MyJob extends QuartzJobBean {
    private MyTask myTask;

    /*
     * (non-Javadoc)
     * @see org.springframework.scheduling.quartz.QuartzJobBean#executeInternal(org.quartz.
     * JobExecutionContext)
     * @date: 2014-1-19
     * @author: juluce
     */
    @Override
    protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException {
        myTask.run();
    }

    /**
     * myTask的GET方法
     * @return MyTask myTask.
     * @date: 2014-1-19
     * @author: juluce
     */
    public MyTask getMyTask() {
        return myTask;
    }

    /**
     * myTask的SET方法
     * @param myTask The myTask to set.
     * @date: 2014-1-19
     * @author: juluce
     */
    public void setMyTask(MyTask myTask) {
        this.myTask = myTask;
    }
}

3 创建一个触发器类,这里使用的是Quartz提供的Cron Trigger,在Spring里,使用的是CronTriggerBean来做映射,主要是定义cron表达式,具体可以参考quartz的官方文档,这里定义的是每隔10秒运行一次;当然还有最主要的具体的Job类实例; 最后定义了一个SchedulerFactoryBean的bean,其中定义了具体要调度那些触发器;

<?xml version="1.0" encoding="GBK"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	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-3.0.xsd"
	default-lazy-init="true">
	<bean id="timerFactory"
		class="org.springframework.scheduling.quartz.SchedulerFactoryBean"
		lazy-init="false">
		<property name="triggers">
			<list>
				<ref local="cronTrigger" />
			</list>
		</property>
	</bean>

	<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
		<property name="jobDetail" ref="myJob" />
		<property name="cronExpression" value="0/10 * * * * ?"></property>
	</bean>

	<bean id="myJob" class="org.springframework.scheduling.quartz.JobDetailBean">
		<property name="name" value="myJob" />
		<property name="group" value="myGroup" />
		<property name="description" value="myJob" />
		<property name="jobClass"
			value="com.juluce.schedule.quartz.trigger.MyJob" />
		<property name="jobDataAsMap">
			<map>
				<entry key="myTask" value-ref="myTask" />
			</map>
		</property>
	</bean>

	<bean id="myTask" class="com.juluce.schedule.quartz.trigger.MyTask">
		<property name="name" value="my task" />
	</bean>
</beans>

4. 最后,写一个测试类来测试上面的代码和配置

/*******************************************************************************
 * @(#)Test.java 2014-1-19
 *
 * Copyright 2014 juluce. All rights reserved.
 *******************************************************************************/
package com.juluce.schedule.quartz.trigger;

import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * <b>Application name:</b> Test.java <br>
 * <b>Application describing: </b> <br>
 * <b>Copyright:</b> Copyright © 2014 juluce 版权所有。<br>
 * <b>Company:</b> juluce <br>
 * <b>Date:</b> 2014-1-19 <br>
 * @author <a href="mailto:juluce133@sina.com"> juluce </a>
 * @version V1.0
 */
public class Test {

    /**
     * {方法功能中文描述}
     * @param args
     * @author: juluce
     */
    public static void main(String[] args) {
        new ClassPathXmlApplicationContext("com/juluce/schedule/quartz/trigger/spring.xml");
    }
}

如此遍实现了任务调度的三种方式。以上都是基于spring3.0.5所做,具体架包可以上我的资源中下载,因为是自己手写,所以收取一积分的辛苦钱,忘见谅。

架包地址:http://download.csdn.net/detail/juluce133/6863949

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值