Spring定时任务是否会重复执行(多线程执行)问题确认。

问题抛出:

    当我们设置一个定时任务时间间隔为5秒,但我们的方法需要执行15秒。 那么定时任务是否会启用多个线程,叠加执行?

测试:

定时任务配置:

        <task:scheduled-tasks>
		<task:scheduled ref="bsMailServiceImpl" method="doAgain" cron="0/5 * * * * ?" />
	</task:scheduled-tasks>

方法编写(一个至少执行15秒的方法):

        public void doAgain() {
		for(int i=0;i<15;i++) {
			try {
				System.out.println(this+"定时任务"+i);
				Thread.sleep(1000L);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
	}

运行结果:

xyz.jangle.demoname.service.impl.BsMailServiceImpl@57d2d963定时任务1
xyz.jangle.demoname.service.impl.BsMailServiceImpl@57d2d963定时任务2
xyz.jangle.demoname.service.impl.BsMailServiceImpl@57d2d963定时任务3
xyz.jangle.demoname.service.impl.BsMailServiceImpl@57d2d963定时任务4
xyz.jangle.demoname.service.impl.BsMailServiceImpl@57d2d963定时任务5
xyz.jangle.demoname.service.impl.BsMailServiceImpl@57d2d963定时任务6
xyz.jangle.demoname.service.impl.BsMailServiceImpl@57d2d963定时任务7
xyz.jangle.demoname.service.impl.BsMailServiceImpl@57d2d963定时任务8
xyz.jangle.demoname.service.impl.BsMailServiceImpl@57d2d963定时任务9
xyz.jangle.demoname.service.impl.BsMailServiceImpl@57d2d963定时任务10
xyz.jangle.demoname.service.impl.BsMailServiceImpl@57d2d963定时任务11
xyz.jangle.demoname.service.impl.BsMailServiceImpl@57d2d963定时任务12
xyz.jangle.demoname.service.impl.BsMailServiceImpl@57d2d963定时任务13
xyz.jangle.demoname.service.impl.BsMailServiceImpl@57d2d963定时任务14
xyz.jangle.demoname.service.impl.BsMailServiceImpl@57d2d963定时任务0
xyz.jangle.demoname.service.impl.BsMailServiceImpl@57d2d963定时任务1
xyz.jangle.demoname.service.impl.BsMailServiceImpl@57d2d963定时任务2
xyz.jangle.demoname.service.impl.BsMailServiceImpl@57d2d963定时任务3
xyz.jangle.demoname.service.impl.BsMailServiceImpl@57d2d963定时任务4
xyz.jangle.demoname.service.impl.BsMailServiceImpl@57d2d963定时任务5
xyz.jangle.demoname.service.impl.BsMailServiceImpl@57d2d963定时任务6
xyz.jangle.demoname.service.impl.BsMailServiceImpl@57d2d963定时任务7
xyz.jangle.demoname.service.impl.BsMailServiceImpl@57d2d963定时任务8
xyz.jangle.demoname.service.impl.BsMailServiceImpl@57d2d963定时任务9
xyz.jangle.demoname.service.impl.BsMailServiceImpl@57d2d963定时任务10
xyz.jangle.demoname.service.impl.BsMailServiceImpl@57d2d963定时任务11
xyz.jangle.demoname.service.impl.BsMailServiceImpl@57d2d963定时任务12
xyz.jangle.demoname.service.impl.BsMailServiceImpl@57d2d963定时任务13
xyz.jangle.demoname.service.impl.BsMailServiceImpl@57d2d963定时任务14
xyz.jangle.demoname.service.impl.BsMailServiceImpl@57d2d963定时任务0
xyz.jangle.demoname.service.impl.BsMailServiceImpl@57d2d963定时任务1
xyz.jangle.demoname.service.impl.BsMailServiceImpl@57d2d963定时任务2
xyz.jangle.demoname.service.impl.BsMailServiceImpl@57d2d963定时任务3
xyz.jangle.demoname.service.impl.BsMailServiceImpl@57d2d963定时任务4
xyz.jangle.demoname.service.impl.BsMailServiceImpl@57d2d963定时任务5

结论:

Spring的定时任务是单线程的,当上一个方法未执行完毕,则不进行下一个方法的执行(并且是跳过这次执行,而不是等待执行完毕,即不存在等待线程积压的问题)

故:当你的定时任务(邮件提醒,短信提醒等)被执行了两次,则需要观察,你的项目是否被重复部署(你的web服务器部署了2个相同的web应用、你的服务器和本地分别启动的web应用)。

发布了129 篇原创文章 · 获赞 20 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/Bof_jangle/article/details/103682360