1. 程式人生 > >Spring下的Quartz的新增動態定時任務

Spring下的Quartz的新增動態定時任務

一.首先明白Spring下Quartz的使用:

需要用到3個類:由上而下依次引用

第一個類

注入了triggers的排程工廠Bean類

org.springframework.scheduling.quartz.SchedulerFactoryBean

第二個類

注入了jobDetail和startDelay及repeatInterval的簡單觸發器Bean類:

org.springframework.scheduling.quartz.SimpleTriggerBean

或者注入了jobDetail和cronExpression的動態觸發器:

org.springframework.
scheduling.quartz.CronTriggerBean

第三個類

注入了targetObject和targetMethod的任務詳情工廠Bean類:

org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean

二.第一種是靜態的定時任務

主要是SimpleTriggerBean的屬性repatInterval的賦值:設定間隔週期的毫秒值

1.書寫詳細的配置檔案:

<!--備份資料庫配置 -->
	<bean id="simpleTrigger_dbbak" class
="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="dbbakjob" /> <property name="startDelay" value="0" /><!-- 排程工廠例項化後,經過0秒開始執行排程 --> <property name="repeatInterval" value="36000000" /><!-- 毫秒級計算,900000==每15分鐘排程一次 --> </bean> <
bean
id="dbbakjob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject"> <ref bean="metaDataDbBackupService" /> </property> <property name="targetMethod" value="backupDb" /> <property name="concurrent" value="true" /><!-- 作業不併發排程 --> </bean>

2.service的Bean注入

<!-- 元資料的備份操作 -->
	<bean id="metaDataDbBackupService"
		  class="com.gilight.dep.metadata.service.impl.MetaDataDbBackupServiceImpl">
		<property name="cacheManager" ref="cacheManager"></property>
		<property name="metaDataBaseRepository" ref="metaDataBaseRepository"></property>
		<property name="metaModelQueryService" ref="metaModelQueryService"></property>
	</bean>

3.書寫對應的業務類

  • MetaDataDbBackupServiceImpl 業務類需要實現
  • IMetaDataDbBackupService 介面
public class MetaDataDbBackupServiceImpl extends BasicServiceImpl<String> implements
		IMetaDataDbBackupService {
	private static final Logger logger = Logger.getLogger(MetaDataDbBackupServiceImpl.class);
	private IMetaDataBaseRepository metaDataBaseRepository = null;
	private IMetaModelQueryService metaModelQueryService = null;
	public IMetaModelQueryService getMetaModelQueryService() {
		return metaModelQueryService;
	}
	public void setMetaModelQueryService(
			IMetaModelQueryService metaModelQueryService) {
		this.metaModelQueryService = metaModelQueryService;
	}
	public IMetaDataBaseRepository getMetaDataBaseRepository() {
		return metaDataBaseRepository;
	}
	public void setMetaDataBaseRepository(
			IMetaDataBaseRepository metaDataBaseRepository) {
		this.metaDataBaseRepository = metaDataBaseRepository;
	}
	@Override
	public void backupDb() throws Exception {
		String path=(String) CustomizedPropertySpringConfigurer.getContextProperty("jdbc.backuppath");
		int radomInt = new Random().nextInt(999999999);
		String userName = (String) CustomizedPropertySpringConfigurer.getContextProperty("jdbc.username");
		String password=(String) CustomizedPropertySpringConfigurer.getContextProperty("jdbc.password");
		String sid=(String) CustomizedPropertySpringConfigurer.getContextProperty("jdbc.sid");

		MdDbBackup mdDbBackup = new MdDbBackup();
		mdDbBackup.setId(UUIDGenerator.getUUID());

		mdDbBackup.setStartTime(MetaDateUtils.getDefaultUpdateDate());
		mdDbBackup.setFileName(radomInt+".dmp");
		mdDbBackup.setResult(DbBakResultStatus.RUNTIME+"");
		this.getMetaDataBaseRepository().create(mdDbBackup);
		//String pathfile=path+"/"+radomInt;
		if (OracleDatabaseBackup.exportDatabaseTool(userName,password,sid,path,radomInt+"")){
			logger.warn("資料庫備份成功");
			mdDbBackup.setResult(DbBakResultStatus.SUCCEED+"");
		}else {
			logger.error("資料庫備份失敗");
			mdDbBackup.setResult(DbBakResultStatus.FAILED+"");
		}
		mdDbBackup.setEndTime(MetaDateUtils.getDefaultUpdateDate());

		this.getMetaDataBaseRepository().update(mdDbBackup);
	}
}

三、第二種是動態的定時任務

主要是CronTriggerBean的cronExpression屬性的cron表示式的賦值;

1. 書寫詳細的配置檔案:

<!--動態觸發器 org.springframework.scheduling.quartz.CronTriggerBean -->
	<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
		<property name="jobDetail" ref="dbBackUpJob" />
		<property name="cronExpression" value="0 0 12 * * ?" /><!--每天中午12點觸發-->
	</bean>
	<bean id="simpleTrigger_dbbak" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
		<property name="jobDetail" ref="dbbakjob" />
		<property name="startDelay" value="0" /><!-- 排程工廠例項化後,經過0秒開始執行排程 -->
		<property name="repeatInterval" value="36000000" /><!-- 毫秒級計算,900000==每15分鐘排程一次 -->
	</bean>

2. 其他配置,業務類和上面第一種一樣

四、動態地從前臺獲得cronExpression並存儲在資料庫;

需要解決的問題是,自定義一個觸發器CustomCronTrigger

  1. 需要繼承CronTriggerBean;
  2. 當資料庫中的cronExpression改變時,停掉並刪除原來的定時任務,
    重新新增一個改變後的定時任務,(這個cronExpression一般是週期性的定時任務);
  3. 要注入一個初始化定時任務的業務;

1. 書寫詳細的配置檔案:

<!-- 我的排程工廠 -->
	<bean id="mySchedulerFactoryBean"
		class="org.springframework.scheduling.quartz.SchedulerFactoryBean"
		lazy-init="false">
		<property name="triggers">
			<list>
				<ref local="customCronTrigger" />
			</list>
		</property>
	</bean>
	<!-- 自定義觸發器 -->
	<bean id="customCronTrigger" class="com.gilight.dep.metadata.service.impl.CustomCronTrigger">
		<property name="jobDetail" ref="myJobDetail" />
		<property name="initBackupTimeService" ref="initBackupTimeService"></property>
	</bean>
	<!-- 動態備份系統jobDetail -->
	<bean id="myJobDetail"
		class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="targetObject">
			<ref bean="systemBackupService" />
		</property>
		<property name="targetMethod" value="backupSystem" />
		<property name="concurrent" value="false" /><!-- 作業不併發排程 -->
	</bean>

2.書寫Service的配置檔案:

<!-- 系統備份業務 -->
	<bean id="systemBackupService" class="com.gilight.dep.metadata.service.impl.SystemBackupServiceImpl">
		<property name="systemBackupRepository" ref="systemBackupRepository"></property>
		<property name="metaDataDbBackupService" ref="metaDataDbBackupService"></property>
		<property name="mySchedulerFactoryBean" ref="mySchedulerFactoryBean"></property>
		<property name="customCronTrigger" ref="customCronTrigger"></property>
		<property name="myJobDetail" ref="myJobDetail"></property>
	</bean>
	<!--初始化系統備份時間業務 -->
	<bean id="initBackupTimeService" class="com.gilight.dep.metadata.service.impl.InitBackupTimeServiceImpl">
		<property name="systemBackupRepository" ref="systemBackupRepository"></property>
	</bean>

3.對應業務類的關係圖

這裡寫圖片描述

4.書寫對應的業務類:

(1).初始化系統備份的更新時間實現類

/**
 * 初始化系統備份的更新時間實現類
 *
 */
public class InitBackupTimeServiceImpl implements IInitBackupTimeService{
	private static final Logger logger = Logger.getLogger(InitBackupTimeServiceImpl.class);
	//注入屬性
	private ISystemBackupRepository systemBackupRepository = null;
	public ISystemBackupRepository getSystemBackupRepository() {
		return systemBackupRepository;
	}
	public void setSystemBackupRepository(ISystemBackupRepository systemBackupRepository) {
		this.systemBackupRepository = systemBackupRepository;
	}
	/**
	 * 獲取CronExpression
	 */
	@Override
	public String getCronExpressionFromDB() throws ServiceException{
		logger.info("-------從資料庫初始化最新的系統備份時間---------------");
		try {
			List<MdSystemBackup> list = systemBackupRepository.getAll();
			if(list != null && list.size()>0){
				//返回表示式
				return list.get(0).getCronExpression();
			}
			return "";
		} catch (RepositoryException e) {
			e.printStackTrace();
			throw new ServiceException("從資料庫獲取最新系統備份時間異常");
		}
	}

}

(2).自定義觸發器:

獲取初始化系統備份的更新時間
在將cronExpression設定到CronTriggerBean中;

/**
 * 自定義觸發器
 * 初始化系統的備份時間
 */
public class CustomCronTrigger extends CronTriggerBean implements Serializable{
	//注入初始化時間業務
	private IInitBackupTimeService initBackupTimeService;
	public IInitBackupTimeService getInitBackupTimeService() {
		return initBackupTimeService;
	}
	public void setInitBackupTimeService(IInitBackupTimeService initBackupTimeService) throws ServiceException{
		this.initBackupTimeService = initBackupTimeService;
		//獲取表示式
		String cronExpression = initBackupTimeService.getCronExpressionFromDB();
		if(cronExpression!=null && !cronExpression.equals("")){
			try{//設定表示式
				setCronExpression(cronExpression);  
			}catch(Exception e){
				e.printStackTrace();
				throw new ServiceException("自定義觸發器的初始化系統的備份時間異常");
			}
		}
	}
}

(3).這個類很重要

1.首先注入5個屬性;
private ISystemBackupRepository systemBackupRepository;//系統備份倉儲層
private IMetaDataDbBackupService metaDataDbBackupService;//系統備份業務介面
private Scheduler mySchedulerFactoryBean;//注入排程工廠,型別Scheduler
private CustomCronTrigger customCronTrigger;//注入自定義觸發器
private JobDetail myJobDetail;//注入任務詳情
2.備份任務的方法backupSystem()
3.儲存更新時間的方法
//當前臺頁面修改了備份時間會訪問這個方法
saveBackupTime(String backupTime,String period);
//從觸發器中獲得原來執行時間和頁面傳來最新時間對比,如果不同,執行
changeJobDetail(backupTime);
4.改變定時任務的方法changeJobDetail(String backupTime)
//是這個類Scheduler 
mySchedulerFactoryBean;
//注入排程工廠,型別Scheduler
//改變定時任務:刪除原來的任務
mySchedulerFactoryBean.deleteJob("myJobDetail", Scheduler.DEFAULT_GROUP);
//新增新任務:其中返回值的Date是觸發器下次執行的時間
Date scheduleJob = mySchedulerFactoryBean.scheduleJob(myJobDetail, customCronTrigger);
//開啟新任務:mySchedulerFactoryBean.start();
/**
 * 系統備份實現類
 * 修改定時任務
 */
public class SystemBackupServiceImpl extends BasicServiceImpl implements ISystemBackupService{
	private static final Logger logger = Logger.getLogger(SystemBackupServiceImpl.class);
	@Override
	public IResponse getByScope(IContext paramIContext) throws ServiceException {
		return null;
	}
	@Override
	public IModel initModel(IContext paramIContext) throws Exception {
		return null;
	}
	@Override
	public Class getModelClass() {
		return null;
	}
	//==============注入屬性===============//
	private ISystemBackupRepository systemBackupRepository;//系統備份倉儲層
	private IMetaDataDbBackupService metaDataDbBackupService;//系統備份業務介面
	private Scheduler mySchedulerFactoryBean;//注入排程工廠,型別Scheduler
	private CustomCronTrigger customCronTrigger;//注入自定義觸發器
	private JobDetail myJobDetail;//注入任務詳情
	
	public ISystemBackupRepository getSystemBackupRepository() {
		return systemBackupRepository;
	}
	public void setSystemBackupRepository(ISystemBackupRepository systemBackupRepository) {
		this.systemBackupRepository = systemBackupRepository;
	}
	public JobDetail getMyJobDetail() {
		return myJobDetail;
	}
	public void setMyJobDetail(JobDetail myJobDetail) {
		this.myJobDetail = myJobDetail;
	}
	public IMetaDataDbBackupService getMetaDataDbBackupService() {
		return metaDataDbBackupService;
	}
	public void setMetaDataDbBackupService(IMetaDataDbBackupService metaDataDbBackupService) {
		this.metaDataDbBackupService = metaDataDbBackupService;
	}
	public CustomCronTrigger getCustomCronTrigger() {
		return customCronTrigger;
	}
	public void setCustomCronTrigger(CustomCronTrigger customCronTrigger) {
		this.customCronTrigger = customCronTrigger;
	}
	public Scheduler getMySchedulerFactoryBean() {
		return mySchedulerFactoryBean;
	}
	public void setMySchedulerFactoryBean(Scheduler mySchedulerFactoryBean) {
		this.mySchedulerFactoryBean = mySchedulerFactoryBean;
	}
	
	/**
	 * 改變定時任務
	 * @param backupTime
	 * @throws ParseException
	 * @throws SchedulerException
	 */
	public void changeJobDetail(String backupTime) throws ParseException, SchedulerException {
		logger.info("-------改變定時任務-------");
		logger.info("原觸發器: "+customCronTrigger.toString());
        	//更新觸發器執行的時間
		customCronTrigger.setCronExpression(backupTime);
		
		//關閉原任務
		boolean deleteJob = mySchedulerFactoryBean.deleteJob("myJobDetail", Scheduler.DEFAULT_GROUP);
		if(deleteJob){
			//新增新任務;返回值Date是觸發器下次執行的時間
			Date scheduleJob = mySchedulerFactoryBean.scheduleJob
            
           

相關推薦

spring整合quartz實現動態定時任務的前臺網頁配置與管理

在實際專案應用中經常會用到定時任務,可以通過quartz和spring的簡單配置即可完成,但如果要改變任務的執行時間、頻率,廢棄任務等就需要改變配置甚至程式碼需要重啟伺服器,這裡介紹一下如何通過quartz與spring的組合實現動態的改變定時任務的狀態的一個實

SpringQuartz新增動態定時任務

一.首先明白Spring下Quartz的使用: 需要用到3個類:由上而下依次引用 第一個類 注入了triggers的排程工廠Bean類 org.springframework.scheduling.quartz.SchedulerFactoryBean

spring-boot-route(二十一)quartz實現動態定時任務

`Quartz`是一個定時任務的排程框架,涉及到的主要概念有以下幾個: `Scheduler`:排程器,所有的排程都由它控制,所有的任務都由它管理。 `Job`:任務,定義業務邏輯。 `JobDetail`:基於Job,進一步封裝。其中關聯一個Job,併為Job指定更詳細的資訊。 `Trigger`:

Spring整合Quartz框架實現定時任務跑批(Maven完整版)

觸發器 delay cut www 方法 lin job 定時任務 任務調度 Quartz 介紹Quartz is a full-featured, open source job scheduling service that can be integrated with

SpringBoot系列5-定時任務-springboot整合quartz實現動態定時任務

springboot有自帶的定時任務為什麼還要使用quartz 使用springboot自帶的定時任務可以很簡單很方便的完成一些簡單的定時任務,但是我們想動態的執行我們的定時任務就比較困難了。然而使用quartz卻可以很容易的管理我們的定時任務,很容易動態的操作定時任務。下面我們就講解下

Spring整合Quartz實現動態定時

一、版本說明  spring3.1以下的版本必須使用quartz1.x系列,3.1以上的版本才支援quartz 2.x,不然會出錯。  原因:spring對於quartz的支援實現,org.springframework.scheduling.quartz.CronTri

SpringQuartz實現的定時任務排程

Corn表示式 一、增加所依賴的JAR包 1. 增加Spring的Maven依賴 <dependency>  <groupId>org.springframework</groupId>  

Spring boot + Quartz實現分散式定時任務

在實際專案中經常會用到定時任務,且有些定時任務同時只能執行一個例項,下面介紹一下通過Spring boot + Quartz框架實現分散式定時任務。 1. 定時任務持久化到Mysql 2. 名稱為JobA的定時任務每10秒執行一次@ScheduledJo

JavaLib-quartz | 基於Spring Boot Quartz開發的定時任務

基於Spring Boot Quartz開發的JavaLib-quartz,目的是幫你快速構建定時任務系統,你可以專心編寫你的業務邏輯,而不必關注定時任務具體是如何實現的,他的效能如何,有沒有異常以及異常處理,監控等等問題。這些你可以在文件中得知。 快速使

Spring整理系列(08)——springquartz整合執行定時任務

專案基於maven進行管理。 一、例項專案程式碼示例: 1、pom.xml檔案所需要的基本jar: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.

spring集合quartz獲取所有定時任務的下次時間

開發十年,就只剩下這套架構體系了! >>>   

Spring整合Quartz動態定時任務新增及刪除的一些操作

我是是一個新手,最近公司要用定時任務,才研究了一下。有什麼錯誤的地方,希望多指正。 1、首先需要一個執行的QuartzJob(任務類)實現Job介面 然後重寫execute(),需要執行的具體方法就寫在這裡面。   2、編寫一個QuartzJob(任務類)的實體類Jo

QuartzSpring動態設定cronExpression (spring設定動態定時任務

"0 0 12 * * ?" 每天中午12點觸發 "0 15 10 ? * *" 每天上午10:15觸發 "0 15 10 * * ?" 每天上午10:15觸發 "0 15 10 * * ? *" 每天上午10:15觸發 "0 15 10 * * ? 2005" 2005年的每天上午10:15觸發 "0

Spring 3整合Quartz 2實現動態定時任務

一、 說明      在做公司的一款產品過程中要實現定時任務功能,而且這款產品是面向不同客戶的,因此具體執行的任務不固定,定時週期也不固定,所以就用到了quartz來實現這個功能。     需要說明的是spring3.1以下的版本必須使用quartz1.

Spring3.1.2+Quartz 1.8.6動態新增持久化定時任務

為什麼有這種需求?每次增加定時任務都要修改配置檔案;有些定時任務不一定是必須的,可以由運維人員去新增刪除或者修改執行時間什麼的,不可能每次都去改程式程式環境:Spring 3.1.2 、Quartz 1.8.6 其他版本沒有試過不過應該差別不大;步驟:總共4個操作:1.1.

SpringQuartz實現動態更新定時任務

applicationContext-quartz.xml配置: <!-- 任務排程測試實現一 : 自定義的任務物件com.bocloud.equipment.test.ExampleJob 必須繼承QuartzJobBean類,實現抽象方法executeInter

Spring 3整合Quartz 2實現定時任務三:動態暫停 恢復 修改和刪除任務

前面我們已經完成了spring 3和quartz 2的整合以及動態新增定時任務,我們接著來完善它,使之能支援更多的操作,例如暫停、恢復、修改等。 在動態新增定時任務中其實已經涉及到了其中的一些程式碼,這裡我們再來細化的理一理。先來看一下我們初步要實現的目標效果圖,這裡

quartz spring 實現動態定時任務

在實際專案應用中經常會用到定時任務,可以通過quartz和spring的簡單配置即可完成,但如果要改變任務的執行時間、頻率,廢棄任務等就需要改變配置甚至程式碼需要重啟伺服器,這裡介紹一下如何通過quartz與spring的組合實現動態的改變定時任務的狀態的一個實現。

Quartz動態設定任務時間/spring動態定時任務

原作者xlxxcc原文傳送門:  PS:專案需求用到了定時任務 ,但是任務的時間是在配置檔案寫好的 ,無法根據使用者的需求 自行更改 ,想到了動態定時任務 ,在網上搜索的好久,但是好多程式碼都是幾年前的老程式碼 1.8版本, 親測可用 ,貼個連結 ,方便大家在

Spring+Quartz框架實現定時任務(集群,分布式)

log cor alt 放置 這一 表達 mod 建數據庫 strac 1、定時任務的必要性:定時任務在應用中的重要性不言而喻,大多是應用,特別是金融應用更是離不開定時任務,能用定時任務來處理異常訂單,完成跑批,定時活動(雙11)等。在初期應用的訪問量並不是那麽大,