Spring Shedule Task之注解实现 (两次启动Schedule Task 的解决方案)

  在spring 中的新引入的task 命名空间。可以部分取代 quartz 功能,配置和API更加简单,并且支持注解方式。

  

第一步:

在Spring的相关配置文件中(applicationContext.xml或者是{project_name}_servelt.xml或者是独立的配置文件如XXX_quartz.xml)中配置并开启Spring Schedule Task.注意其中高亮的部分是必须的。

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4        xmlns:aop="http://www.springframework.org/schema/aop"
 5        xmlns:tx="http://www.springframework.org/schema/tx"
 6        xmlns:context="http://www.springframework.org/schema/context"
 7        xmlns:mvc="http://www.springframework.org/schema/mvc"
 8        xmlns:p="http://www.springframework.org/schema/p"
 9        xmlns:task="http://www.springframework.org/schema/task"
10        xsi:schemaLocation="
11        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
12        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
13        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
14        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
15        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
16        http://www.springframework.org/schema/task
17        http://www.springframework.org/schema/task/spring-task-3.0.xsd
18        ">
19     <mvc:annotation-driven />
20     <context:component-scan base-package="com.mytools.validator.engine" />
21
22     <!-- 启动定时器 -->
23     <task:annotation-driven/>
24 </beans>

第二步:

可以在类中的需要定时执行的方法下指定如下Annotation

1 @Scheduled(cron="0 33/3 * * * ?") //每小时的33分钟开始执行,每3分钟执行1次
2 public void start() throws ServletException {
3        validate();
4 }

备注:其实@Scheduled中可以指定如下3种时间表达式:

(1)fixedRate:每隔多少毫秒执行一次该方法。如:

1 @Scheduled(fixedRate=2000)  // 每隔2秒执行一次
2 public void scheduleMethod(){
3     System.out.println("Hello world...");
4 }   

(2)fixedDelay:当一次方法执行完毕之后,延迟多少毫秒再执行该方法。

(3)cron:详细配置了该方法在什么时候执行。cron值是一个cron表达式。如:

1 @Scheduled(cron="0 0 0 * * SAT")
2 public voidarchiveOldSpittles() {
3    // ...
4 }

 到指定时间后,任务总是执行2次的解决方案:

这是因为我们很容易在一个基于Spring的Web工程中启动2个定时线程:

第一次:web容器启动的时候,读取applicationContext.xml(或者别的Spring核心配置文件)文件时,会加载一次。

第二次:Spring本身会加载applicationContext.xml(或者别的Spring核心配置文件)一次。

解决方案:将你的Task的相关配置独立出来并在web.xml中通过context-param加载。而不是通过spring加载。

1) 独立出Spring-Task,如新命名一个文件名叫cms_quartz.xml

2)    在web.xml中去加载该文件:

1 <context-param>
2      <param-name>contextConfigLocation</param-name>
3      <param-value>/WEB-INF/cms-servlet.xml, classpath:cms-quartz.xml</param-value>
4 </context-param>

注:出自 http://www.tuicool.com/articles/jmU7bq

时间: 2024-10-05 05:08:52

Spring Shedule Task之注解实现 (两次启动Schedule Task 的解决方案)的相关文章

Spring Schedule task 添加 error-hander

原因来自于系统有两天定时任务执行失败,查阅日志时,只能看到 Unexpected error occurred in scheduled task. 在Spring 源码中,可以从TaskUtils中看出端倪,Spring 默认提供的定时任务处理器是 LoggingErrorHandler private static class LoggingErrorHandler implements ErrorHandler { private final Log logger = LogFactory

使用spring提供的@Scheduled注解创建定时任务

使用方法 操作非常简单,只要按如下几个步骤配置即可 1. 导入jar包或添加依赖,其实定时任务只需要spring-context即可,当然起服务还需要spring-web: 2. 编写定时任务类和方法,在方法上加@Scheduled注解,注意定时方法不能有返回值,如果采用包扫描方式注册bean,还需要在类上加组件注解: 3. 在spring容器中注册定时任务类: 4. 在spring配置文件中开启定时功能. 示例Demo maven依赖 <dependency> <groupId>

Spring SpringMVC SpringBoot SpringCloud 注解整理大全

Spring SpringMVC SpringBoot SpringCloud 注解整理 这段时间学习了一些框架,里面用到了很多注解,记不住所以把遇到的注解都整理了下来,如果有不对的地方欢迎指正,我会修改的φ(??∀??)? Spring 常用配置: @import :导入配置类 @Scope : 新建Bean的实例 @Scope("prototype") 声明Scope 为 Prototype @Value : 属性注入 @Value ("我爱你") -->

Spring MVC的常用注解

1.@Controller 控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示. @COntroller用于标记一个类,即控制类,spring使用扫描机制查找应用程序中所有基于注解的控制类.分发处理器会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping注解,而使用@RequestMapping注解的方法才是真正处理请

Spring XML配置--使用注解装配(@Atutowired、@Inject、@Resource)

陈科肇--http://blog.csdn.net/u013474104/article/details/44352765 ======= 1.装配术语 创建应用对象之间协作关系的行为通常被称为装配 2.使用注解装配 Spring是从Spring2.5开始引入使用注解自动装配的. Spring容器是默认禁用注解装配的,因此如果要使用Spring的注解装配,你必须启用它.启用方式:使用Spring的context命名空间配置中的<context:annotation-config>元素,配置启用

Spring的Bean管理(注解管理)

Spring注解的IOC入门步骤: 步骤一:下载spring的开发包 http://repo.spring.io/webapp/search/artifact/?0&q=spring-framework 解压:(Spring目录结构:) * docs:API和开发规范. * libs:jar包和源码. * schema:约束. 步骤二:创建Web项目,引入spring开发jar包 核心jar包四个:bean/Core/Context/Expression Language 两个开发包 : log

spring实战之使用注解装配

使用注解装配: 从spring2.5开始,Spring启用了使用注解自动装配Bean的属性,使用注解方式自动装配与在XML中使用 autowire 属性自动装配并没有太大区别,但是使用注解方式允许更细粒度的自动装配. Spring容器默认禁用注解装配.所以,在使用基于注解的自动装配前,需要在Spring配置中启用它,最简单的启用方式是使用spring的context命名空间配置中的 <context:annotation-config>元素,如下所示: <?xml version=&qu

Spring MVC常用的注解

1.@Controller 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示.在SpringMVC 中提供了一个非常简便的定义Controller 的方法,你无需继承特定的类或实现特定的接口,只需使用@Controller 标记一个类是Controller ,然后使用@RequestMapping 和@RequestP

JavaEE开发之Spring中的条件注解、组合注解与元注解

上篇博客我们详细的聊了<JavaEE开发之Spring中的多线程编程以及任务定时器详解>,本篇博客我们就来聊聊条件注解@Conditional以及组合条件.条件注解说简单点就是根据特定的条件来选择Bean对象的创建.条件注解就是可以根据不同的条件来做出不同的事情.在Spring中条件注解可以说是设计模式中状态模式的一种体现方式,同时也是面向对象编程中多态的应用部分.而组合注解就是将现有的注解进行组合.下方会给出具体的介绍和实例. 一.条件注解[email protected] 本篇博客的本部分