SpringBoot 動態定時任務

2021-10-10 12:48:21 字數 3621 閱讀 7701

最近在工作中遇到了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...