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
- 需要繼承CronTriggerBean;
- 當資料庫中的cronExpression改變時,停掉並刪除原來的定時任務,
重新新增一個改變後的定時任務,(這個cronExpression一般是週期性的定時任務); - 要注入一個初始化定時任務的業務;
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的組合實現動態的改變定時任務的狀態的一個實
Spring下的Quartz的新增動態定時任務
一.首先明白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
Spring和Quartz實現的定時任務排程
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)——spring與quartz整合執行定時任務
專案基於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
Quartz在Spring中動態設定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.
Spring與Quartz實現動態更新定時任務
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)等。在初期應用的訪問量並不是那麽大,