之前我用JAVA中的Timer类实现了服务器的定时任务,具体详见之前的博文。

后来发现了一个更简单的实现方式,利用spring中的@Scheduled注解实现觉得简单的很多。

确实spring封装的特别好,实现起来比原来简单多了。

下面是配置。

在spring的xml配置中最上面加入

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.1.xsd

在后面加入

<!-- 用于定时器的配置 -->

<task:annotation-driven/>

最后写一个定时器的类就行了,写法可以和controller类似,上面的注解不一样而已

@Component
public class TimeTask { @Autowired
public IUserService userService; @Scheduled(cron="0/5 * * * * ? ")
public void test()
{
System.out.println("");
}
}

然后运行项目你就能发现每5秒执行一次

然后发现两个使用上面的问题。

问题1:如果配置了多个定时任务,当有任务1执行时间过长的时候会阻塞任务2

如下面所示

@Component
public class TimeTask { @Autowired
public IUserService userService; @Scheduled(cron="0/5 * * * * ? ")
public void test()
{
System.out.println("11111111111111111111111111111111111");
} @Scheduled(cron="0/1 * * * * ? ")
public void test2() throws InterruptedException
{
TimeUnit.SECONDS.sleep(10);//模拟延时10秒
System.out.println("222222222222222222222222222222222");
} }

你会发现11111和22222是同时打印的,1111并不是5秒打印一次了。所以你需要配置线程池。

把之前的spring中的配置修改为下面这样,20是线程池的大小,根据具体项目需求来设置。

<task:annotation-driven scheduler="myScheduler"/>
    <task:scheduler id="myScheduler" pool-size="20"/>

问题2,定时任务莫名其妙被执行两次。

一开始就发现了这个问题,莫名其妙会输出111111和111111两次。连续两次。

就相当任务被同时执行了两次,一开始我觉得奇怪,但是后来查询资料发现了我的一个大问题。

在web。xml中加载了两次相同的spring配置

就相当于spring的上下文被创建了两次,导致定时任务也就创建了两次,所以导致这个问题的发生

一开始的配置

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:config/applicationContext.xml</param-value>
</context-param>
<servlet>
<servlet-name>springMVC_dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:config/applicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

加载两个applicationContext

后面修改成了两个配置文件

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:config/beans.xml</param-value>
</context-param>
<servlet>
<servlet-name>springMVC_dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:config/applicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

一个加载定时器和controller的相关配置,一个加载数据库相关配置。

然后就解决了。

下面是stackoverflow中对这个问题的描述

http://stackoverflow.com/questions/3672289/spring-3-scheduled-task-running-3-times

深层次的原因可以看我的另一篇博文

http://www.cnblogs.com/linkstar/p/5782027.html

下面转载一个定时器时间上面的配置,因为定时器的时间配置不好记,所以暂时记录一下,和linux上面的定时任务很像。

http://rainbowdesert.iteye.com/blog/2107220

最后是spring官网的文档,我没看,英文不好

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html

spring项目中的定时任务实现和问题解决的更多相关文章

  1. spring项目中使用定时任务

    当我们希望在某个时间点来执行一些业务方法的时候就用到定时任务,在spring的项目中使用定时任务很简单.如下 第一步.加入jar包 <dependency> <groupId> ...

  2. 【spring boot】spring boot中使用定时任务配置

    spring boot中使用定时任务配置 =============================================================================== ...

  3. spring 项目中在类中注入静态字段

    有时spring 项目中需要将配置文件的属性注入到类的静态字段中 例如:文件上传 //文件上传指定上传位置 //resource-dev.properties 有如下参数 #upload UPLOAD ...

  4. java web项目(spring项目)中集成webservice ,实现对外开放接口

    什么是WebService?webService小示例 点此了解 下面进入正题: Javaweb项目(spring项目)中集成webservice ,实现对外开放接口步骤: 准备: 采用与spring ...

  5. 在Java Web项目中添加定时任务

    在Java Web程序中加入定时任务,这里介绍两种方式:1.使用监听器注入:2.使用Spring注解@Scheduled注入. 推荐使用第二种形式. 一.使用监听器注入 ①:创建监听器类: impor ...

  6. Spring Boot 中实现定时任务的两种方式

    在 Spring + SpringMVC 环境中,一般来说,要实现定时任务,我们有两中方案,一种是使用 Spring 自带的定时任务处理器 @Scheduled 注解,另一种就是使用第三方框架 Qua ...

  7. spring项目中如何添加定时器以及在定时器中自动生成sprng注入对象

    最近做了一个java的项目,部门领导给了一套代码让我尽快掌握,说心里话本人真心不喜欢java的这种项目方式,各种配置各种xml文件简直头都大了,下面就将我遇到的其中一个我认为是坑的地方整理出来,希望能 ...

  8. 9. spring项目中web.xml详解解读

    引言:本篇博客的内容大部分都来自网上,有的是直接copy,有的是自己整理而来.既然网上已经有了,为啥还有自己copy呢? 感觉是因为网上的东西太散了或者是样式不够美观,所以自己又copy了一遍.如有侵 ...

  9. Spring项目中执行Java脚本

    问题:在已搭建好Spring环境的JavaWeb项目中,怎么运行一段Java代码,执行一些类似脚本的功能. 情况一:测试局部功能,不需要依赖Spring框架的. 方法:IDEA中新建一个类,编写主函数 ...

随机推荐

  1. Python 学习笔记12

    不积跬步,无以至千里.不积小流,无以成江河. 当我觉得沮丧.绝望的时候,就疯狂的敲代码,这样会好受一点. 今天和昨天敲了两天的小程序,算是对python的具体语法规则有个初步的手熟. http://w ...

  2. SQL函数学习(二):DATEADD() 函数

    DATEADD() 函数在日期中添加或减去指定的时间间隔. 语法 DATEADD(datepart,number,date) date 参数是合法的日期表达式.number 是您希望添加的间隔数:对于 ...

  3. windows任务计划程序路径设置

    用任务计划启动程序,特别是脚本,比如我要启动python脚本,其中有一句是这么写的 BasePath = removeLastSlash(os.path.abspath("..\\..\\& ...

  4. JPA 系列教程16-继承-联合子类-JOINED

    联合子类策略 这种情况下子类的字段被映射到各自的表中,这些字段包括父类中的字段,并执行一个join操作来实例化子类. 举例 如果实体类Teacher继承实体类Person,实体类Student也继承自 ...

  5. 软件测试之α测试和Beta测试

    实施验收测试的常用策略有三种,它们分别是: · 正式验收 · 非正式验收或Alpha 测试 · Beta 测试 因此,Alpha测试和Beta测试都属于验收测试.所谓验收测试是软件产品完成了功能测试和 ...

  6. NSTimer 销毁问题 和 iOS中控制器的释放问题

    俗话说的好,前人栽树后人乘凉,最近看了很多博文,不少博文提到了NSTimer的销毁问题, 之前我都没怎么注意,现在对照着文章一一实践发现坑还真不少.下面是我读到的几篇博文分享给大家 @啸笑天的NSTi ...

  7. Linux查找文件中的字符串命令

    grep -nr 'archermind' -r, --recursive Read all files under each directory, recursively, following sy ...

  8. RecyclerView onTouch & onClick 触摸事件与点击事件

    遇到一种情况需要处理,RecyclerView所在Activity需要处理滑动事件用于返回(onBackPressed). 手势检测: @Override public boolean onFling ...

  9. iOS特殊字符的转义字符

    所有的ASCII码都可以用“\”加数字(一般是8进制数字)来表示.而C中定义了一些字母前加"\"来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等,就称为转义字符,因为 ...

  10. 升级3.2.3后 could not find driver

    求解,之前一切正常,升级3.2.3后提示找不到数据库驱动我用的是mysql,也没有设置DB_DSN错误位置FILE: C:\Users\Administrator\workspace\test\Thi ...