问题抛出:
当我们设置一个定时任务时间间隔为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应用)。