之前我用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. 利用pscp命令实现linux与windows文件互传

    windows==>linux(单个文件) PrivateKey.ppk(私钥)可以是相对路径或者绝对路径pscp -i D:\PrivateKey.ppk D:\xxx.xx root@123 ...

  2. Openlayer 3 的画线测量长度

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. Android makefile 组织结构

    下面是main.mk文件包含关系,本文档主要说明的就是这些文件里到底做了什么.(这个文件被根目录下的makefile文件包含) 一.     main.mk BUILD_SYSTEM=build/co ...

  4. apache 添加到windows服务

    cmd命令行下 输入 “d:\apache\bin\httpd.exe” -k install 如果是resin的话直接运行目录下的setup就可以了, 前提是需要.net framework 3.5

  5. List------Linked 链表

    1.Definition Linked list consists of a series of nodes. Each nodes contains the element and a pointe ...

  6. EntityFramework日志记录

    首先在应用启动时执行:DbInterception.Add(new LogFormatter());   然后加入如下类: #region [ EF的数据库执行日志记录 ] public class ...

  7. 给EditText设置边框

    布局文件中加入background属性: <EditText android:layout_width="200dp" android:layout_height=" ...

  8. 模拟。。。 Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) C

    题目大意:给你一个n*m的矩阵,再给你一个小球,从(0,0)以sqrt(2)/s的速度向右上角出发,遇到边框会反弹,遇到角落就直接停止,给你一些点,问小球第一次经过这些点所需要的时间. 思路:模拟一下 ...

  9. linux下如何开放80端口

    linux清屏命令:clear linux版本:CentOS6.5 1.开启80端口命令:/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT2.保存 ...

  10. Log4j 简介及初步应用

    使用2.5版本有问题,暂时没有解决,也许是JDK版本不兼容的原因.因此使用的是log4j-1.2.8.jar 1.三个组件 日志记录器  ——  Logger.输出目的地 —— Appender.输出 ...