spring的同一定时任务上一次的任务未结束前不会启动这次任务问题

 更新时间:2023年12月28日 10:45:13   作者:asdfghzqlj  
这篇文章主要介绍了spring的同一定时任务上一次的任务未结束前不会启动这次任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

xml配置信息概略

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 
 	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:task="http://www.springframework.org/schema/task"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
		http://www.springframework.org/schema/task 
		http://www.springframework.org/schema/task/spring-task-3.0.xsd"
	default-lazy-init="true"  >
 
        <bean name="testJob" class="com.focus.support.job.TestJob" />
	<task:scheduled-tasks><!-- 定时任务每10秒执行一次-->
	 	<task:scheduled ref="testJob" method="pushConFamily" cron="*/10 * * * * ?"/>
	</task:scheduled-tasks>
</beans>

直接上代码

package com.focus.support.job;
 
import java.util.ArrayList;
import java.util.List;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
/**
 * @author
 * @date 2018年6月5日
 * @version 2.1.1
 */
public class TestJob {
	
	private static final Logger log = LoggerFactory.getLogger(TestJob.class);
	
	private static Integer lastJobMaxPushIdStatus1 = 0;//上次推送的最大查询主键ID
	private static final String lockLastJobTimeStatus1 = "lockLastJobTimeStatus1";
	private static int times = 0;
	
	public void pushConFamily(){
		times++;
		log.info("TestJob.Start > "+lastJobMaxPushIdStatus1);
		List<Integer> list;
		if(lastJobMaxPushIdStatus1 == 0) {
			if(times != 1) System.out.println("等待开始"+times);
			synchronized (lockLastJobTimeStatus1) {
				if(times != 1) System.out.println("等待结束"+times);
				list = chaxunAll();
				if (list.size() > 0) {
					lastJobMaxPushIdStatus1 = list.get(0);
					
					for(int i=0;i<list.size();i++) {
						pushData();
					}
				}
			}
		} else {
			list = chaxunAll();
			if (list.size() > 0) {
				lastJobMaxPushIdStatus1 = list.get(0);
				
				for(int i=0;i<list.size();i++) {
					pushData();
				}
			} else {
				lastJobMaxPushIdStatus1 = 0;
			}
		}
		log.info("TestJob.End > "+lastJobMaxPushIdStatus1);
	}
	
	
	private List<Integer> chaxunAll() {
		System.out.println("执行查询操作");
		int size = 0;
		int maxId = 0;
		if(times == 1) {
			size = 80;
			maxId = 80;
		}
		if(times == 2) {
			size = 30;
			maxId = 90;
		}
		if(times == 3) {
			size = 15;
			maxId = 95;
		}
		List<Integer> list = new ArrayList<>(size);
		for(int i=0;i<size;i++) {
			list.add(maxId);
		}
		return list;
	}
 
	private void pushData() {
		try {
			Thread.sleep(1000);
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
}

执行结果

[2018-06-05 19:43:50] [com.focus.support.job.TestJob] - TestJob.Start > 0
执行查询操作
[2018-06-05 19:45:10] [com.focus.support.job.TestJob] - TestJob.End > 80
[2018-06-05 19:45:20] [com.focus.support.job.TestJob] - TestJob.Start > 80
执行查询操作
[2018-06-05 19:45:50] [com.focus.support.job.TestJob] - TestJob.End > 90
[2018-06-05 19:46:00] [com.focus.support.job.TestJob] - TestJob.Start > 90
执行查询操作
[2018-06-05 19:46:15] [com.focus.support.job.TestJob] - TestJob.End > 95
[2018-06-05 19:46:20] [com.focus.support.job.TestJob] - TestJob.Start > 95
执行查询操作
[2018-06-05 19:46:20] [com.focus.support.job.TestJob] - TestJob.End > 0
[2018-06-05 19:46:30] [com.focus.support.job.TestJob] - TestJob.Start > 0
等待开始5
等待结束5
执行查询操作
[2018-06-05 19:46:30] [com.focus.support.job.TestJob] - TestJob.End > 0
[2018-06-05 19:46:40] [com.focus.support.job.TestJob] - TestJob.Start > 0
等待开始6
等待结束6
执行查询操作
[2018-06-05 19:46:40] [com.focus.support.job.TestJob] - TestJob.End > 0
[2018-06-05 19:46:50] [com.focus.support.job.TestJob] - TestJob.Start > 0
等待开始7
等待结束7
执行查询操作
[2018-06-05 19:46:50] [com.focus.support.job.TestJob] - TestJob.End > 0

从输出结果的时间看出,有以下结论

1.上次任务未结束前,本次任务如果已到则不会启动

2.上次任务结束时,如果与本次任务启动的时间一致,则本次任务也不会启动,而是会往后顺延一次定时时间再启动

好了,以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java类的加载时机

    Java类的加载时机

    这篇文章介绍了Java类的加载时机,文中通过示例代码介绍的非常详细。对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • 2023最新版IDEA创建javaweb项目的详细图文教程

    2023最新版IDEA创建javaweb项目的详细图文教程

    之前用的社区版IDEA无法部署JavaWeb项目,于是装了一个最新版的IDEA,下面这篇文章主要给大家介绍了关于2023最新版IDEA创建javaweb项目的详细图文教程,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • Spring Boot拦截器和监听器实现对请求和响应处理实战

    Spring Boot拦截器和监听器实现对请求和响应处理实战

    这篇文章主要介绍了Spring Boot拦截器和监听器实现对请求和响应处理实战,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • Java基础知识之BufferedReader流的使用

    Java基础知识之BufferedReader流的使用

    这篇文章主要介绍了Java基础知识之BufferedReader流的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • @DynamicUpdate //自动更新updatetime的问题

    @DynamicUpdate //自动更新updatetime的问题

    这篇文章主要介绍了@DynamicUpdate //自动更新updatetime的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • java编程中拷贝数组的方式及相关问题分析

    java编程中拷贝数组的方式及相关问题分析

    这篇文章主要介绍了java编程中拷贝数组的方式及相关问题分析,分享了Java中数组复制的四种方式,其次对二维数组的简单使用有一段代码示例,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java网络编程基础详解

    Java网络编程基础详解

    网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。本文介绍了一些网络编程基础的概念,并用Java来实现TCP和UDP的Socket的编程,来让读者更好的了解其原理
    2021-08-08
  • Java Springboot之Spring家族的技术体系

    Java Springboot之Spring家族的技术体系

    今天带大家来学习Spring家族的技术体系,文中有非常详细的图文介绍及代码示例,对正在学习java的小伙伴们很有帮助,需要的朋友可以参考下
    2021-05-05
  • java -jar启动服务并输出日志常用命令小结

    java -jar启动服务并输出日志常用命令小结

    这篇文章主要介绍了在Linux环境下运行JAR包的几种方法,包括在命令结尾添加&使其在后台运行,使用nohup使程序不挂断运行,以及将日志输出到指定文件或丢弃,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-03-03
  • Java微信公众平台开发(6) 微信开发中的token获取

    Java微信公众平台开发(6) 微信开发中的token获取

    这篇文章主要为大家详细介绍了Java微信公众平台开发第六步,微信开发中的token获取,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04

最新评论