Spring 定时执行任务重复执行多次

  使用spring的定时任务组件的时候,代码如下。

@Scheduled(cron="0 5/5 * * * ?")
	    public void sendWeatherSMS()
	    {
			String messageContent = messageFactory.getWeatherSMS();
			//如果生成短信内容为空的话,则重试3次。
			int retryTimes = 3;
			while(retryTimes>=0&&isEmpty(messageContent)){
				logger.error("生成天气信息短信失败。正在进行第"+(4-retryTimes) +"次重试");
				try {
					Thread.sleep(1000*(10- retryTimes));
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					logger.error(e);
				}
				messageContent=messageFactory.getWeatherSMS();
				retryTimes--;
			}

			String phoneNumbers = getSendWeatherInfoPhoneNum().trim();
			if(!isEmpty(messageContent)){
				foSendSMS.execute(phoneNumbers, messageContent);
			}else{
				logger.error("生成天气信息短信失败。");
			}

	        System.out.println("sendWeatherSMS   "+phoneNumbers+"    "+ messageContent + new Date());
	    }

  忽略掉方法中的,取得内容短信为空后最大重试3次的逻辑。在触发改cron的表达式的时候,发现sendWeatherSMS()方法执行了3次。网上也搜了一些答案, 一开始就是说配置文件文档,tomcat问题,感觉不科学。google一下,发现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.

也就是说,造成这个问题的原因在于,自己配置不当或者程序的问题,导致bean被加载了多次。因此解决的办法就是,排除一些Task所在的bean被初始化的地方,避免bean被多次初始化。 我的解决方案是,把schedule的配置文件,单独放到一个xml,避免被多次引用。

时间: 2024-10-20 20:59:16

Spring 定时执行任务重复执行多次的相关文章

使用定时器实现JavaScript的延期执行或重复执行

使用定时器实现JavaScript的延期执行或重复执行 window 对象提供了两个方法来实现定时器的效果,分别是window.setTimeout()和 window.setInterval.其中前者可以使一段代码在指定时间后运行:而后者则可以使一段代码 每过指定时间就运行一次.它们的原型如下: window.setTimeout(expression,milliseconds); window.setInterval(expression,milliseconds); 其中,expressi

Spring的quartz定时器重复执行二次的问题解决

Spring的quartz定时器同一时刻重复执行二次的问题解决 最近用Spring的quartz定时器的时候,发现到时间后,任务总是重复执行两次,在tomcat或jboss下都如此. 打印出他们的hashcode,发现是不一样的,也就是说,在web容器启动的时候,重复启了两个quartz线程. 研究下来发现quartz确实会加载两次: 第一次:web容器启动的时候,读取applicationContext.xml文件时,会加载一次. 第二次:Spring本身会加载applicationConte

Spring 定时任务重复执行的问题分析

背景:使用quartz时客户现场不知道为什么跑着跑着就停了,后来决定换成spring定时任务. 当使用spring定时任务时莫名奇妙的就是同一时间重复执行多次任务(通常情况下执行两次,有时候会达到3次).下面记录过程并逐一分析说明,供以后参考: 1.分析原因后发现是由ClassPathXmlApplicationContext导致 通过n多次试验发现: 当任务方法中不含任何业务逻辑时(如:只打印一些标志性的信息),任务能够正常执行,没有重复执行的现象: 当任务方法中包含业务逻辑,或应用程序执行别

ScheduledThreadPoolExecutor 定时重复执行任务

import java.util.concurrent.*; import java.util.*; public class TestGreenhouseScheduler {     private volatile boolean light = false;     private volatile boolean water = false;     private String thermostat = "Day";     public synchronized Stri

运维程序】简单的命令控制器(支持定时命令执行、重复定时任务命令和进程管理,开发这个小程序主要是为了方便管理服务进程)【个人github项目】

一.前言: command-controller 一个运维程序,简单的命令控制器(支持定时命令执行和重复定时命令,开发这个程序主要是为了方便管理服务进程) 本来是要用python做的,但是之前做ffmpeg的时候已经写了一部分Java的命令控制功能了,有些代码就拿过来改改用了(其实是为了偷懒qaq) 二.实现功能 1.进程管理 只支持本程序启动的进程管理,本程序主要功能是定时执行某些脚本或者系统命令,当然命令行和脚本是很自由的,更多用法请自行探索 2.定时命令.任务 3.重复定时命令.任务 4.

js定时器整理(执行一次、重复执行)

在javascritp中,有两个关于定时器的专用函数,分别为: 1.倒计定时器:timename=setTimeout("function();",delaytime); 2.循环定时器:timename=setInterval("function();",delaytime); 第一个参数"function()"是定时器触发时要执行的动作,可以是一个函数,也可以是几个函数,函数间用":"隔开即可. 比如要弹出两个警告窗口,便

springmvc chrome jsonviewer 一起请求 重复提提交 controller重复执行 2次执行

情况一: springmvc chrome jsonviewer 一起请求 重复提提交 controller重复执行 2次执行 Chrome浏览器地址栏访问接口url,重复请求问题解决 不论刷新还是地址栏回车都会重复请求两次接口,但是换Firefox浏览器就没有这个问题,命令行curl也是正常的,后来发现是Chrome浏览器Jsonview插件的原因导致的. 将图片中红色框内的勾去掉即可,如果选择了该项,那么浏览器会被强制重复发送一次HTTP请求来获取原始HTTP内容. 这跟springmvc框

iOS: 零误差或极小误差的定时执行或延迟执行?

问题如下: 节奏类游戏需要执行很多的跟音乐节拍相关的操作,并且为了保证节奏感,需要让操作跟节拍的关系十分紧密.对两者间隔要求不能超过0.02秒或更低. 目前使用了 GCD 中的 asyncAfter(deadline:)方法,不过误差总是要大于0.05秒,并且还无法保证误差会不会传递下去.请问有更好的方式来解决误差吗? var time = Date().timeIntervalSince1970 let dq = DispatchQueue(label: "queue", qos:

remove name="ProxyModule“会导致重复执行

<?xml version="1.0" encoding="utf-8"?> <!-- 有关如何配置 ASP.NET 应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkId=169433 --> <configuration> <appSettings> <add key="DomainProxy1" value="http://e3