spring framework web @Scheduled 执行两次的问题

与本文相关的关键词:Spring @Scheduled 执行两次的问题

使用组件:Spring framework web mvc

现象如下:使用@Scheduled标注的方法会执行两次

通过google输入关键词:spring @scheduled called twice,会显示许多人遇到相似问题。

该问题的根本原因就是包含有@Scheduled方法的类被初始化两次。

在spring官方说明中有如下提示:

Make sure that you are not initializing multiple instances of the same @Scheduled
annotation class at runtime, unless you do want to schedule callbacks to each such instance. Related to this, make sure that you do not use @Configurable on bean classes which are annotated with @Scheduled and registered as regular Spring beans with the container:
You would get double initialization otherwise, once through the container and once through the @Configurable aspect, with the consequence of each @Scheduled method being invoked twice.

由于英文不好,只能看明白大体意思:就是不要初始化两次同一个@Scheduled标注的类。

解决思路如下:

1、在web.xml文件中重复加载相关类

首先说下web.xml这个文件,通常都包含以下节点:

 <context-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>/WEB-INF/config/springContext.xml</param-value>
 </context-param>

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

 <servlet>
     <servlet-name>springServlet</servlet-name>
     <servlet-class>
         org.springframework.web.servlet.DispatcherServlet
     </servlet-class>
     <init-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>
             /WEB-INF/config/spring-beans.xml
         </param-value>
     </init-param>
     <load-on-startup>1</load-on-startup>
 </servlet>

 <servlet-mapping>
     <servlet-name>springServlet</servlet-name>
     <url-pattern>*.html</url-pattern>
     <url-pattern>*.do</url-pattern>
 </servlet-mapping>

注意其中的两个节点:context-param和servlet>init-param,这两个节点分别对应着servletContext(适用于整个Context)和servletConfig(适用于当前servlet)

无论是在context-param中,还是在init-param中,都可以设置配置文件,如果这两个地方同时加载了任务类,可能导致上述现象出现,解决办法是删除其中一个,这也是stackOverflow等网站提出的解决办法,如http://stackoverflow.com/questions/3672289/spring-3-scheduled-task-running-3-times。

也有网友说删除

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

但实际删除后会显示错误。

我遇到的情况则与重复加载有所不同,我的文件中没有重复加载,这个路子没有测试成功。

2、tomcat/conf/server.xml配置文件

最终在国内看到这篇文章:http://nkliuliu.iteye.com/blog/816335,另外打个广告:我的目前供职的网站是http://www.ickd.cn/(该链接仅针对采集程序,实际访客请无视)

需要修改:tomcat/conf/server.xml,

<Host name="localhost"  appBase=""
           unpackWARs="true" autoDeploy="true"
           xmlValidation="false" xmlNamespaceAware="false">  

       <Context  docBase="/usr/local/apache-tomcat-6.0.29/webapps/semwinner"  path=""   reloadable="true"></Context>
       <Context  docBase="/usr/local/apache-tomcat-6.0.29/webapps/emarboxmanager"  path="/admin"   reloadable="true"></Context>  

     </Host>  

把appBase设置为空即可!

去除了appBase="webapps"中的webapps变成了appBase="",因为web应用程序都是放在webapps这个目录下的,如果 不把“webapps“去掉,这里会调用一次quartz的任务调度,在接下来的“<Context path”中又会调用一次quartz的任务调度,所以就重复了2次

根据博主提示,成功解决问题。在此谢谢博主。

时间: 2024-09-28 19:40:15

spring framework web @Scheduled 执行两次的问题的相关文章

spring scheduler相同时间内执行两次的问题

在网上找了大片文章,有的说是上下文被夹在两次的问题,可我配置scheduler的上下文着实没被夹在多次 之后才在网上找到,虽然还不明白原理,但是还是贴出来分享下 spring scheduler相同时间内执行两次的问题,布布扣,bubuko.com

Spring MVC controller 被执行两次

interceptor 被执行两次 后来发现 时controller被执行两次 后来发现是jsp页面有个: <img src="#" > 导致被执行两次. 解决方案:去掉

@Scheduled 执行两次的问题

使用Springboot搭建web程序,类上面用@Component表明项目启动就扫描到这个文件,@Scheduled用在方法上 日志显示重复执行了代码(下图显示启动了两个线程) 解决方案: 修改tomcat/conf/server.xml里面的配置内容,将appBase的值由webapps修改为"" 因为web应用程序都是放在webapps这个目录下的,如果 不把"webapps"去掉,这里会调用一次quartz的任务调度,在接下来的"<Conte

Java工程师之Spring Framework深度剖析专栏

系列前言 关于本系列 本系列章节目录 Spring Framework核心篇 重新来认识你的老朋友Spring框架 Spring容器装配Bean的三种方式 Spring Framework WEB篇 Spring WEB配置文件上传的两种方式 Spring Framework 数据篇 Spring项目对JDBC的支持和基本使用 勘误&感谢 本系列文章资料来源很多出自于互联网和在下本身的见解,受限于个人技术能力水平和其他相关知识的限制,相关见解错误或者资料引用错误请各位帮助留言校正!引用资料多来自

Spring @Scheduled 服务器上定时任务执行两次

昨天写了一个定时任务,每五分钟执行一次. 通过日志观察总是执行两次,并且是两个线程执行的.刚开始以为是spring加载了两遍. 包括网上说web.xml 和spring 各加载了一遍,导致最后执行两次. 最后排查原来是tomcat配置问题 这是之前的配置 . 这是之后的配置. 修改后,只执行一次.

Spring 被初始化两次(Spring-Task定时任务执行两次)分析和解决方法

初始问题: 采用Spring-Task配置定时任务,任务执行两次,该问题在Eclipse调试环境上不出现 分析问题: 第一步:开始怀疑业务逻辑,通过排查和定位排除业务原因(通过日志可以查看多次执行) 1 @Component("collection.car") 2 public class CollectionCarsJob { 3 private static Logger logger = LoggerFactory.getLogger(CollectionCarsJob.clas

spring 定时器执行两次

spring错误笔记 spring定时器执行两次因为导入了两次 关于配置文件如下 <bean id="timeTaskService" class="xx.xxx.xxx.xxx.service.impl.na.TimeTaskService"/> <task:scheduled-tasks scheduler="myScheduler"><!--30秒执行一次 --> <task:scheduled r

Struts+Spring+Hibernate的Web应用执行过程

struts1和spring有两种整合的方法  一种是action和spring bean映射:一种是将action交给spring初始化 第一种方式:访问.do的URL->tomcat接收到request-〉到Struts配置文件里找对应的action-〉找到对应的action组件(Action那个类)-〉这个类对request进行一系列处理-〉调用spring提供的某个service的注入实例的方法->由这个方法返回值-〉响应输出 第二种方式:访问.do的URL->tomcat接收到

分析解决 spring quartz 中出现的执行两次问题

1. 问题描述 在开发询盘功能时,遇到一个需求,就是后台定时任务执行用电施工业务的工单下发. 使用的技术是 spring quartz,因为其他应用有先例,配置quartz 完成后,先写了一个 helloworld 测试下. 然而却发现,每次到定时时间后,程序都会执行两次. 2. 分析过程 先使用 bing 搜索了下看别人是否也遇到过类似问题,果然有. http://blog.csdn.net/jiang117/article/details/43077275 上面文档的作者,查找的原因是 Co