1. 程式人生 > >spring的同一定時任務上一次的任務未結束前不會啟動這次任務

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.上次任務結束時,如果與本次任務啟動的時間一致,則本次任務也不會啟動,而是會往後順延一次定時時間再啟動

相關推薦

spring同一定時任務任務結束啟動這次任務

xml配置資訊概略<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://w

git 撤回commit中某一個想添加的文件

發現 如果 reset use 查看 不想 一次 文件刪除 git 1. 假設我們修改了文件a,同時修改了IDE的配置文件b 2.此時我們只想添加文件a到commit中,卻不小心將b也添加進去了 3.那麽怎麽撤回呢? 4.第一種方法: 4.1 git reset --

Spring Boot 同一賬號只允許登陸

spring security關於session management的實現     請參考:http://group.jobbole.com/24133/ 根據上面博文新增相應程式碼後,並不能實現使上一次登陸失效。要實現請參考下面的博文: &nb

阿里雲伺服器Spring Boot工程的簡單部署

我最近在阿里雲上釋出一個網站,沒有配置Jenkins環境,所以釋出我都用手動的方式去完成。 這裡我是在本機打好了jar包,然後將Spring Boot的jar包通過scp傳送到伺服器,確保專案中配置的

$("#tabs") 保持瀏覽的tab

save spa nbsp func getc ive log void new $(function () { $(".tabsli").click(function () { //keep last active tab, to avoid

eclipse沒有正確關閉,導致啟動的時候卡死錯誤解決方法

delete eclipse 刪除 關閉 進入 nap 解決方法 文件 delet 關於 eclipse啟動卡死的問題(eclipse上一次沒有正確關閉,導致啟動的時候卡死錯誤解決方法),自己常用的解決方法: 方案一(推薦使用,如果沒有這個文件,就使用方案二):

點選事件被循化累加呼叫,沒點選 點選事件執行次數比+1,解決

利用jquery的unbind方法, $('#id').unbind('click').bind('click',function(){ //事件處理 }); 定義和用法 unbind() 方法移除被選元素的事件處理程式。 該方法能夠移除所有的或被選的事件處理程式,或者當事件發生

檢視修改的歷史記錄 git log 命令 和 返回修改版本 git reset 、git reflog(五)

上一篇,已經學會了修改檔案,然後再把修改檔案提交到Git版本庫,now,再重複執行一次,修改index.html檔案如下: 然後執行新增、提交: 像這樣,你不斷對檔案進行修改,然後不斷提交修改到版本庫裡,每次修改到一定程度時,再提交;一旦你把檔案改亂了,或者誤刪了檔案,還可以從最

Cookie瀏覽器會話技術顯示登陸時間

案例:  可以顯示上一次登陸時間     記錄上次訪問的時間     需求:         當用戶第一次登陸的時候,提示:你是第一次登陸,且記錄該次訪問時間

課”根本找到啊

mysql如何避免使用swap(zt)mysql如何避免使用swap(zt) association和collection直接在資料查詢是有多條資料的mybatis為什麼只返回了第一條資料 關於系統記錄使用者操作日誌及物件變更問題關於系統記錄使用者操作日誌及物件變更問題 如何

axios取消請求

專案需求:列表式切換商品,有時候上一次請求的結果非常慢,而我又點了另外一個商品,這時候第二次請求的介面比上一次快,那麼就點選第二次的商品看到的資訊卻是上一次的商品資訊,這樣的使用者體驗極其不好; 解決方案:在點選下一個商品的時候,將上一個商品請求的介面中斷取消請

vue axios請求頻繁時取消請求

一、前言 在專案中經常有一些場景會連續傳送多個請求,而非同步會導致最後得到的結果不是我們想要的,並且對效能也有非常大的影響。例如一個搜尋框,每輸入一個字元都要傳送一次請求,但輸入過快的時候其實前面的請求並沒有必要真的傳送出去,這時候就需要在傳送新請求的時候直接取消上一次請求。 二、程式碼 &l

如何實現頁面載入就將選擇操作的下拉框值回顯出來

案例 —————————————————————— 頁面效果:(頁面載入完畢自動回顯的資料) Html程式碼: <select id="planId" style="width:180px;" onchange="changePlan();">

SparkStreaming(17):updateStateByKey運算元,保留計算結果

1.實現功能 如果SparkStreaming程式斷掉,重新啟動,可以讀取斷掉之前的結果。通過,使用SparkStreaming的HA:checkpoints。 2.程式碼 package _0809kafka //import com.beifeng.util.

Linux小技巧-返回目錄、及一些control快捷鍵

1、Linux回到上一次目錄 cd -     -  ==  $OLDPWD 可以 echo $OLDPWD檢視 cd -   ==   cd $OLDPWD   一不小心輸入cd 直接回車就會跑

axios 封裝帶請求頻繁取消請求

axios 封裝 首先引入axios 建立例項 import axios from 'axios' // 建立axios例項 const service = axios.create({ baseURL: process.env.BASE_API, // api的base_url

js按住滑鼠左鍵選中網格元素,被選中的網格位置填充可輸入內容,插入圖片等的容器。並且網格的容器,可拖動、改變尺寸、但互相之間不可重疊(如果重疊回到的狀態)。

js/jquery 按住滑鼠左鍵圈選網格,圈選網格顏色變深, 圈選區域不可重疊,被選中的網格位置上填充可輸入內容,插入圖片、媒體,表格、echarts圖表等的容器。並且網格上的容器可拖動,可改變尺寸,但不可重疊(如果重疊回到上一次的狀態), 上述要求為本次實際開發專案(vu

visio開啟提示開啟失敗,需在安全模式下啟動解決方案

  今天visio不知道怎麼了,之前好好的,突然不能用了,提示需要在安全模式下啟動。點選了是也還是沒有啟動,修復和重新安裝了幾次也不行。 後面百度到解決“WORD上次啟動時失敗,以安全模式啟動”方法 這篇文章解決了問題。   解決方案: 使用everythin

winform DataGridView 重新整理,滾動條定位到的位置

DataGridView  輸出列表,經常會用到滾動條。 在重新載入列表後,如果還要定位到上一次滾動條所在的位置,那下面的方法就能實現, 1  給DataGridView   繫結Scroll 事件。 2  Scroll 事件要做的事,分別記錄滾動條移動位置的數值。 用

MVC中將匯出的EXCEL檔案匯入驗證並儲存到資料庫中

1、網頁中加入file元素,並新增表單 @using (Html.BeginForm("StationImport", "home", FormMethod.Post, new { enctype = "multipart/form-data" })) {     <