`

spring 3 中使用注解的方式来进行任务调度。

 
阅读更多

 

以上内容基于Spring 3.0.5 版本运行,参考文档为spring-framework-reference-3.0.5.pdf

 

在spring3 中的task 命名空间。可以部分去取代 quartz,并且支持注解方式。但是如果使用更加复杂的任务调度。还是建议是使用quartz。以下就使用 task 和 quartz来进行任务调度的方法进行距离。

  • 使用 注解来 来调度任务

编写一个任务实例。


/***********************************************************************
  *
  *   TestJob.java
  *
  *   ****所有,
  *   受到法律的保护,任何公司或个人,未经授权不得擅自拷贝。
  *   @copyright       Copyright:   2000-2011  
  *   @creator          徐泽宇 <br/>
  *   @create-time   2011-6-27   下午11:51:16
  *   @revision         $Id:     *
  ***********************************************************************/ 
package com.alcor.aerie.quartz;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
@Service 
public class TestJob {
	/**
	 * Logger for this class
	 */
	private static final Logger logger = LoggerFactory.getLogger(TestJob.class);
	@Scheduled(fixedDelay = 1000) 
	public void work()
    {
		if (logger.isDebugEnabled()) {
			logger.debug("work() - start"); //$NON-NLS-1$
		}
		logger.info("Spring Quartz的TestJob任务被调用!"); 
		if (logger.isDebugEnabled()) {
			logger.debug("work() - end"); //$NON-NLS-1$
		}
    } 
}
 

注意其中的@Scheduled 标签

配置spring的ApplicationContext.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:context="http://www.springframework.org/schema/context" 
    xmlns:task="http://www.springframework.org/schema/task" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/fex
        http://www.springframework.org/schema/fex/spring-fex-1.5.xsd
        http://www.springframework.org/schema/task 
        http://www.springframework.org/schema/task/spring-task-3.0.xsd 
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">
	
	<!--  定时器开关  开始-->
	<task:annotation-driven/>
	<!--  定时器开关  结束--> 
	
</beans>
 

注意:其中xmlns里面加入 :  xmlns:task="http://www.springframework.org/schema/task" 。在 xsi:schemaLocation中加入   http://www.springframework.org/schema/task        http://www.springframework.org/schema/task/spring-task-3.0.xsd 。在配置中加入

<!--  定时器开关  开始-->
    <task:annotation-driven/>
<!--  定时器开关  结束-->

如果开发的是web应用,那么在web.xml里面加入

<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

就可以在context启动的时候,自动扫描和装备这个被调度的任务。

  • 不使用注解,而通过配置来调度任务

编写一个任务实例

/***********************************************************************
  *
  *   TestJob.java
  *
  *   ****所有,
  *   受到法律的保护,任何公司或个人,未经授权不得擅自拷贝。
  *   @copyright       Copyright:   2000-2011  
  *   @creator          徐泽宇 <br/>
  *   @create-time   2011-6-27   下午11:51:16
  *   @revision         $Id:     *
  ***********************************************************************/ 
package com.alcor.aerie.quartz;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
@Service 
public class TestJob {
	/**
	 * Logger for this class
	 */
	private static final Logger logger = LoggerFactory.getLogger(TestJob.class);
	public void work()
    {
		if (logger.isDebugEnabled()) {
			logger.debug("work() - start"); //$NON-NLS-1$
		}
		logger.info("Spring Quartz的TestJob任务被调用!"); 
		if (logger.isDebugEnabled()) {
			logger.debug("work() - end"); //$NON-NLS-1$
		}
    } 
}
 

注意:这里work方法上没有@Scheduled注解了

 

在ApplicationContext.xml中加入调度方法


<task:scheduled-tasks>
    <task:scheduled ref="testJob" method="work" cron="1/3 * 2-23 * * ?"/>
</task:scheduled-tasks>
 

 

cron表达式

原文来源于:

http://biaoming.iteye.com/blog/39532

一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素。

按顺序依次为

秒(0~59)

分钟(0~59)

小时(0~23)

天(月)(0~31,但是你需要考虑你月的天数)

月(0~11)

天(星期)(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)

7.年份(1970-2099)

其中每个元素可以是一个值(如6),一个连续区间(9-12),一个间隔时间(8-18/4)(/表示每隔4小时),一个列表(1,3,5),通配符。由于"月份中的日期"和"星期中的日期"这两个元素互斥的,必须要对其中一个设置?.

0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
0 0/30 9-17 * * ?   朝九晚五工作时间内每半小时
0 0 12 ? * WED 表示每个星期三中午12点
"0 0 12 * * ?" 每天中午12点触发 
"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点到下午2:59期间的每1分钟触发 
"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发 
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发 
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和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年至2005年的每月的最后一个星期五上午10:15触发 
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发

有些子表达式能包含一些范围或列表

例如:子表达式(天(星期) )可以为 “MON-FRI”,“MON,WED,FRI”,“MON-WED,SAT”

“*”字符代表所有可能的值

因此,“*”在子表达式( )里表示每个月的含义,“*”在子表达式(天(星期) )表示星期的每一天

 

“/”字符用来指定数值的增量

例如:在子表达式(分钟)里的“0/15”表示从第0分钟开始,每15分钟

         在子表达式(分钟)里的“3/20”表示从第3分钟开始,每20分钟(它和“3,23,43”)的含义一样


“?”字符仅被用于天(月)和天(星期)两个子表达式,表示不指定值

当2个子表达式其中之一被指定了值以后,为了避免冲突,需要将另一个子表达式的值设为“?”

 

“L” 字符仅被用于天(月)和天(星期)两个子表达式,它是单词“last”的缩写

但是它在两个子表达式里的含义是不同的。

在天(月)子表达式中,“L”表示一个月的最后一天

在天(星期)自表达式中,“L”表示一个星期的最后一天,也就是SAT

如果在“L”前有具体的内容,它就具有其他的含义了

例如:“6L”表示这个月的倒数第6天,“FRIL”表示这个月的最一个星期五

注意:在使用“L”参数时,不要指定列表或范围,因为这会导致问题

 

 

字段   允许值   允许的特殊字符
  0-59   , - * /
  0-59   , - * /
小时   0-23   , - * /
日期   1-31   , - * ? / L W C
月份   1-12 或者 JAN-DEC   , - * /
星期   1-7 或者 SUN-SAT   , - * ? / L C #
年(可选)   留空, 1970-2099   , - * /

分享到:
评论

相关推荐

    Spring Boot中的@Scheduled注解:定时任务的原理与实现

    这个注解主要基于Java的内置Timer类以及Quartz等定时任务库,但在Spring Boot中,它提供了更加简洁和易用的方式来实现定时任务。 # 实现原理 @Scheduled注解的实现原理主要依赖于Spring框架的任务调度机制。当...

    Java课程实验 Spring Boot 任务管理(源代码+实验报告)

    在Spring Boot中,可以使用多种方式来实现任务管理。 使用Java自带的定时任务库: 1.在Spring Boot中,你可以使用@Scheduled注解来创建定时任务。将@Scheduled注解与方法一起使用,指定任务执行的时间表达式。 2....

    SpringMvc自动任务调度之task实现项目源码

    但如果只是简单的跑个任务其实spring升级到3后已经自带任务调度器了,相比之下Spring task无论是理解还是使用都简单很多。但是Quartz有线程和线程管理以及集群等高级特性,所以大家可以自行选择了。不过一般情况下,...

    使用spring @Scheduled注解执行定时任务

    使用spring @Scheduled注解执行定时任务

    Spring quartz 定时任务调度

    Spring Quartz 定时调度任务,带中文注解与jar文件,导入项目即可直接运行。

    Spring+3.x企业应用开发实战光盘源码(全)

     第13章:本章重点对在Spring中如何使用Quartz进行任务调度进行了讲解,同时还涉及了使用JDK Timer和JDK 5.0执行器的知识。  第14章:介绍Spring 3.0新增的OXM模块,同时对XML技术进行了整体的了解。  第15章:对...

    基于Spring Boot + Quartz 的分布式任务调度系统.zip

    集成了分布式任务调度框架 Quartz ,任务存储于数据库。 使用SpringMVC作为路由控制, 集成 Swagger2 提供实时 RESTful API文档。 数据持久层集成 Mybatis 框架。 使用自定义注解 @TargetDataSource 实现了多数据源...

    Spring.3.x企业应用开发实战(完整版).part2

    《Spring3.x企业应用开发实战》是在《精通Spring2.x——企业应用开发详解》的基础上,经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练使用...

    Spring中文帮助文档

    6.8.1. 在Spring中使用AspectJ进行domain object的依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7...

    spring boot @scheduled定时任务配置

    spring boot @scheduled注解 cron 表达式实现计划任务调度。

    Spring3.0作业调度

    Spring3.0作业调度Spring3.0内置的定时调度的功能可以通过注解及XML配置来实现。Sping3Demo项目的com.chinadim.demo.spring.schedule包路径下的两个示例程序尽可能简洁地演示了怎样使用这两种方式。 接下来,我们来...

    Spring3.x企业应用开发实战(完整版) part1

    《Spring3.x企业应用开发实战》是在《精通Spring2.x——企业应用开发详解》的基础上,经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练使用...

    Spring-Reference_zh_CN(Spring中文参考手册)

    6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入 6.8.1.1. @Configurable object的单元测试 6.8.1.2. 多application context情况下的处理 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来...

    陈开雄 Spring+3.x企业应用开发实战光盘源码.zip

     第13章:本章重点对在Spring中如何使用Quartz进行任务调度进行了讲解,同时还涉及了使用JDK Timer和JDK 5.0执行器的知识。  第14章:介绍Spring 3.0新增的OXM模块,同时对XML技术进行了整体的了解。  第15章:...

    Spring定时任务@Scheduled例子

    Spring的任务调度@Scheduled注解——task:scheduler和task:executor的解析,做了一些测试说明了各个参数的作用

    Spring的 Scheduled任务调度.docx

    说明:@Scheduled 注解用于标注这个方法是一个定时任务的方法,有多种配置可选。cron支持cron表达式,指定任务在特定时间执行;fixedRate以特定频率执行任务;fixedRateString以string的形式配置执行频率。

    Spring API

    6.8.1. 在Spring中使用AspectJ进行domain object的依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7...

    Spring攻略(第二版 中文高清版).part1

    6.2 在你的Servlet和过滤器中使用Spring 214 6.2.1 问题 214 6.2.2 解决方案 215 6.2.3 工作原理 215 6.3 将Spring与Struts 1.x集成 220 6.3.1 问题 220 6.3.2 解决方案 220 6.3.3 工作原理 220 6.4...

    Spring 2.0 开发参考手册

    6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ Load-time weaving(LTW) 6.9. ...

    spring boot异步(Async)任务调度实现方法

    在没有使用spring boot之前,我们的做法是在配置文件中定义一个任务池,然后将@Async注解的任务丢到任务池中去执行,那么在spring boot中,怎么来实现异步任务的调用了,下面通过本文给大家讲解,需要的朋友参考下

Global site tag (gtag.js) - Google Analytics