最近在工作中遇到了springboot 動態執行定時任務的場景,通過資料庫動態指定任務的執行頻率,禁用或啟動定時任務等,通過尋找資料,成功解決了這一場景, 一起分享一下吧
1 資料庫設計:
create
table
`spring_scheduled_cron`
(`cron_id`
int(11)
notnull
auto_increment
comment
'主鍵id'
,`cron_key`
varchar
(128
)not
null
comment
'定時任務完整類名(該類必須繼承 timingtask類)'
,`cron_expression`
varchar(20
)not
null
comment
'cron表示式'
,`task_explain`
varchar(50
)not
null
default
''comment
'任務描述',`
status
`tinyint(4
)not
null
default
'1'comment
'狀態,1:正常;2:停用'
,primary
key(
`cron_id`),
unique
key`cron_key`
(`cron_key`),
unique
key`cron_key_unique_idx`
(`cron_key`))
engine
=innodb
auto_increment=4
default
charset
=utf8mb4 comment
='定時任務表'
;
public
inte***ce
3 自定義任務類
public
abstract
class
timingtask
implements
runnable
public
void
setschedule
(schedule schedule)
@override
public
void
run(
)//執行的任務
public
abstract
void
task()
;@override
public string tostring()
}
4 編寫動態任務配置類
@configuration
@enablescheduling
public
class
dynamictask
implements
schedulingconfigurer
, triggercontext -
>
newperiodictrigger
(5l, timeunit.seconds)
.nextexecutiontime
(triggercontext));
}public
void
createtask
(list
schedulelist)
catch
(classnotfoundexception e)
在spring內找不到!"
,taskconstant.
getcronkey()
);return;}
//獲取bean後轉換未 timingtask 物件
if(bean instanceof
timingtask)}
);this
.refreshtasks
(tts.
toarray
(new
timingtask
[tts.
size()
]));
} logger.
info
("定時任務載入完成!");
}private
void
refreshtasks
(timingtask.
.. tasks)
}for
(timingtask timingtask : tasks)
//如果配置一致,並且處於啟用狀態 則不需要重新建立定時任務
if(scheduledfutures.
containskey
(timingtask.
getschedule()
.getcronid()
)&& crontasks.
get(timingtask.
getschedule()
.getcronid()
).getexpression()
.equals
(expression)
&& timingtask.
getschedule()
.getstatus()
.equals
("1"))
//如果策略執行時間發生了變化(如cron表示式修改,狀態修改),則取消當前策略的任務,重新建立
if(scheduledfutures.
containskey
(timingtask.
getschedule()
.getcronid()
))//如果任務有效,才建立
if(timingtask.
getschedule()
.getstatus()
.equals
("1"))
cron表示式==>{}"
,timingtask.
getschedule()
.getcronkey()
,timingtask.
getschedule()
.getcronexpression()
);}}
}private
boolean
exists
(integer taskid,timingtask.
.. tasks)
}return
false;}
@predestroy
public
void
destroy()
}
大功告成,啟動測試:
在資料庫內插入資料,定時任務能正常執行,並且在不重啟伺服器的情況下通過改變資料庫的 cron表示式或狀態能夠控制定時任務的啟動和停止,修改定時任務執行頻率
參考了幾篇大佬的部落格:希望同樣對您有用:
springboot定時任務原理及如何動態建立定時任務
在spring boot中動態實現定時任務配置
springboot動態定時任務
前提概述 springboot定時器開發特別簡單,本篇文章不做介紹 通過配置 enablescheduling和 scheduled cron 實現 動態定時器相對複雜,大概有兩種實現方式 1.讀取資料庫的cron引數,2.讀取配置檔案cron引數。我這邊採用讀取配置檔案的方式簡單的介紹一下如何使用...
springboot動態定時任務
spring boot通過註解 enablescheduling和 scheduled實現的是靜態定時任務,不能動態新增 停止 修改等.本文通過threadpooltaskscheduler實現定時任務動態增刪改.建立threadpooltaskscheduler bean public threa...
SpringBoot動態定時任務
其實schedulingconfigurer實現方法很簡單,只需要實現schedulingconfigurer並重寫configuretasks方法,在啟動類必須加上 enablescheduling註解即可。configuration enablescheduling slf4j public c...