1. 程式人生 > >動態改變Cron表示式,來實現動態執行Spring定時任務

動態改變Cron表示式,來實現動態執行Spring定時任務



spring定時器非常強大,但是有時候我們需要在不需要重啟應用就可以動態的改變Cron表示式的值。這樣我們可以在配置檔案中寫一個表示式的值。每次想改變表示式的值的時候手動修改配置檔案中的表示式,實現動態表示式。但是我們也可以從資料庫中動態讀取,都是一樣的。

一:首先定義一個類,這個類用於被定時器排程,這個類不需要繼承任何類或者介面。

MyJob.java

package quartz2;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.quartz.Scheduler;
import org.springframework.scheduling.quartz.CronTriggerBean;
public class MyJob {
	private Scheduler scheduler;
	private static int step=0;
	public void setScheduler(Scheduler scheduler) {
		this.scheduler = scheduler;
	}
	/**
	 * 定時呼叫此方法
	 * @throws Exception
	 */
	public void doSomething() throws Exception {
		System.out.println("***********************"+step+"***********************");
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String str=df.format(new Date());
		System.out.println("time:"+str);
		if(step==1){
			//滿足特定的條件  呼叫此方法 重設表示式 重新開啟新的任務 
			//表示式可以根據需求從配置檔案 或者資料庫中讀取
			resetJob("0/10 * * * * ?");
		}
		step++;
	}
	/**
	 * 重設定時器表示式
	 * @param cronExpression
	 * @throws Exception
	 */
	public void resetJob(String cronExpression) throws Exception {
		CronTriggerBean trigger = (CronTriggerBean) scheduler.getTrigger("myTrigger", Scheduler.DEFAULT_GROUP);
		String oldConExpression = trigger.getCronExpression(); 
		if (!oldConExpression.equalsIgnoreCase(cronExpression)) {
			trigger.setCronExpression(cronExpression);
			scheduler.rescheduleJob("myTrigger", Scheduler.DEFAULT_GROUP, trigger);
		}
	}
}

spring配置檔案

<?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:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
	<bean id="myJob" class="quartz2.MyJob" >
		<property name="scheduler" ref="schedulerFactory" />
	</bean>
	<bean id="myQuartzJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">    
		<property name="targetObject" ref="myJob" />    
		<property name="targetMethod" value="doSomething" />    
		<property name="concurrent" value="false" />
	</bean>
	<bean id="myTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">       
		<property name="jobDetail" ref="myQuartzJob" />
		<property name="cronExpression">           
			<value>0/20 * * * * ?</value>       
		</property>   
	</bean>
	<bean name="schedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">    
		<property name="triggers">      
			<list>            
				<ref bean="myTrigger" /> 
			</list>    
		</property>
	</bean>
</beans>

客戶端程式碼

Config.java

package quartz2;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Config {
	public static void main(String[] args) {
		ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");  
	}
}




相關推薦

動態改變Cron表示式實現動態執行Spring定時任務

 spring定時器非常強大,但是有時候我們需要在不需要重啟應用就可以動態的改變Cron表示式的值。這樣我們可以在配置檔案中寫一個表示式的值。每次想改變表示式的值的時候手動修改配置檔案中的表示式,實現動態表示式。但是我們也可以從資料庫中動態讀取,都是一樣的。 一:首先定

spring與quartz整合實現分布式動態創建刪除改變執行時間定時任務(mysql數據庫)

ces value 我們 job clu xsd collect 註解 common 背景:因為在項目中用到了定時任務,當時想到了spring的quartz,寫完發現費了很大功夫,光是整合就花了一上午,其中最大的問題就是版本問題,項目中用的是spring3.2.8的版本,查

SpringBoot定時任務動態修改cron表示式改變執行週期

   一、場景引入        前不久做過一個根據下載指令定時下載檔案到伺服器的需求。輪詢下載的週期需要根據下載任務量的大小動態修改,下載任務密集的時候就週期縮小,下載任務少量時就擴大週期時間。java本身和第三方開源框架Spring共

LINQ 通過動態生成lambda表示式實現根據指定屬性名稱對序列進行排序

目前,對於Linq只是初步接觸,還不熟悉,做專案的時候想到一個問題,如果想要查詢任意欄位的排序結果集,該怎麼實現? 我們知道,T-SQL是非常容易解決這個問題,只要簡單通過拼接T-SQL就可以達到該效果。 那麼,Linq該怎麼實現呢? 網上查了很多資料,找到一種辦法就是通過

只要十步你就可以應用表示式優化動態呼叫

表示式樹是 .net 中一系列非常好用的型別。在一些場景中使用表示式樹可以獲得更好的效能和更佳的擴充套件性。本篇我們將通過構建一個 “模型驗證器” 來理解和應用表示式樹在構建動態呼叫方面的優勢。 Newbe.Claptrap 是一個用於輕鬆應對併發問題的分散式開發框架。如果您是首次閱讀本系列文章。建議可以先

php使用ob緩存實現動態頁面靜態化

數據庫操作 rom sql name con pre 頁面靜態化 nts lec 例子: <?phpinclude_once ‘common/common.php‘;//數據庫操作方法$fileName = ‘test.html‘;$expr = 10;//緩存時間$

js - 運用內嵌實現動態布局

var 解決方法 content 變化 -a html 原來 ner left     js魅力所在應該就是它的靈活性很強,比如說當用了 元素.innerHTML=(所要內嵌的結構),加上事件和函數以後神奇的事就要發生了,原來的結構發生了變化,元素裏又內嵌了一個結

web調用手機相冊實現動態增加圖片功能

ogr capture form use rod index oot 3.3 jquery 註:經測試h5調用相冊效果有兼容性問題,安卓僅能調用拍照功能(部分安卓可能會調不起來,所以建議用app原生調用),ios可調起拍照和相冊功能。 <html xmlns="

asp.net頁面通過Javascript使用CanvasJS.Chart畫曲線曲線實現動態載入後臺資料(通過ajax)

頁面程式碼: <html> <head> <script src="jQuery.js" type="text/javascript"></script> <script src="https://canvasjs.com/assets/

spring定時任務實現動態定時任務(啟停週期修改)

使用方法:             複製下方程式碼,在業務需要處呼叫(定時任務狀態和執行週期被修改後),一定要在專案啟動時後立刻執行一次庫中全資料呼叫此方法,List<Cron> crons   Cron中一定要有業務類的包加類名(com.rails.trave

用canvas實現動態時鐘

之前用簡單的css與js來實現動態的時鐘,發現直接用canvas也可以畫時鐘,只不過時鐘圈和指標應該要放在不同的畫布canvas中比較好,因為指標所在的畫布是要一直旋轉的,詳細程式碼如下(如有問題,望大家指出,一起進步哈!) <!DOCTYPE html> &l

Spring定時任務開發實現動態修改時間引數手動開啟關停等

@Service @Lazy(false) @EnableScheduling public class MyScheduler extends BaseService implements SchedulingConfigurer{ public static String cron

jQuery中利用keyup事件和判斷是否為漢字實現動態搜尋

需求:有時候在做介面搜尋功能的時候,會想要根據使用者輸入的漢字來檢索出相應的內容。要求是動態的檢索,使用者每次輸入一個字或一個詞就會進行關鍵字模糊搜尋。 實現方法:如果直接使用文字框的keyup()事

springboot Quartz動態修改cron表示式

1、概述: 在開發中有的時候需要去手動禁止和啟用定時任務,修改定時任務的cron表示式然後再讓其動態生效,之前有過SSM的類似的業務的開發但是忘記寫下來了。。。只好重新溫習了一次,加上最近比較流行springBoot所以升級了一下用springBoot來完成.2、關聯技術 S

hibernate(jpa)根據實體動態生成查詢條件實現分頁問題的解決方案

hibernate如何根據傳進去實體的不為空屬性生成動態查詢,並實現分頁,經過檢視hibernate api需要用到Criteria ,但是Criteria 有個缺點就是當另一個表A中某一外來鍵列是該表B的主鍵,如果A表中有兩條記錄對應B表的某一主鍵,則查詢結果中B表的該記錄

JAVA中使用程式碼建立多資料來源實現動態切換(一)

摘要: 案例基於Spring+mybatis。 設計的目的:解決不確定(個數和種類)資料來源的切換問題 2017-06-06 11:31:57補充:近日,在本文的基礎之上,擴充套件了下,使用atomikos來管理事務,保證多資料來源操作時,事務一致性。(htt

怎樣使用FreeMarker實現動態網頁靜態化

眾所周知,隨著網站的訪問量增加,如何給使用者以良好的訪問體驗就顯得尤為重要。提升網站效能便成為一些網站面臨的一大難題,像hao123這樣的導航網站要提升網站的效能只要部署的web伺服器數量足夠就可以承載超大規模的訪問量,如果是一個動態的網站呢?例如像鳳凰新聞、網易新聞這樣的

android多渠道打包(動態改變地址打包只需改下版本號)

多渠道打包本來不想寫的,因為比較麻煩,所以沒打算寫。只是前段時間因為電腦藍屏重灌了系統,導致不能打包了,所以又百度了半天,今天就寫下來做個筆記。廢話不多說,進入主題。配置多渠道打包就要使用友盟統計build.gradle中新增友盟的依賴包://友盟統計 compile 'co

AbstractRoutingDataSource動態資料來源切換AOP實現動態資料來源切換

AbstractRoutingDataSource動態資料來源切換 上週末,室友通宵達旦的敲程式碼處理他的多資料來源的問題,搞的非常的緊張,也和我聊了聊天,大概的瞭解了他的業務的需求。一般的情況下我們都是使用SSH或者SSM框架進行處理我們的資料來源的資

Vue.js 的一個小技巧---利用v-for中的index值實現隔行變色

type 樣式 lin class idt title mes har oct   首先定義好樣式,利用v-for中的index值,然後綁定樣式來實現隔行變色效果。    以下為完整代碼,很簡單,但也是個技巧。 <!DOCTYPE html> &