SpringBoot動態配置定時任務 支援毫秒級

2021-10-02 18:37:09 字數 2228 閱讀 6626

專案中使用攜程apollo進行配置管理,需要實現動態配置job的執行間隔。

使用動態修改cron表示式的方式可以實現,但是cron表示式不支援毫秒,所以採用以下方式進行配置。

每次配置改動時,將舊的定時任務停掉,重新啟動乙個定時任務。

/**

* shang

* 2020-02-11 15:41

*/@slf4j

@component

public

class

orderjob")

private

long orderscheduleinterval;

private

static

final

string lock =

"lock"

;private

final

set<

string

>

orderidset =

sets

.newhashset()

;@resource

private

ordermanager ordermanager;

@resource

private

threadpooltaskscheduler threadpooltaskscheduler;

@apolloconfig

private

config config;

private

scheduledfuture

<

?>

future;

@apolloconfigchangelistener

private

void

configchangelistener

(configchangeevent changeevent)

periodictrigger periodictrigger =

newperiodictrigger

(long

.valueof

(interval)

,timeunit

.milliseconds)

; periodictrigger.

setfixedrate

(true);

periodictrigger.

setinitialdelay

(1000);

future = threadpooltaskscheduler.

schedule

(this

::readorderidset

, periodictrigger)

; log.

info

("start order task");

} log.

info

("{}:{}"

, key, config.

getproperty

(key,

null))

;}}/**

* 寫入緩衝set

** @param orderids

*/public

void

writeorderidset

(set

<

string

>

orderids)

synchronized

(lock)

}/**

* 定時任務從緩衝set裡取

*/// 這樣配置無法動態修改執行間隔

// @scheduled(fixedrate = 2000)

public

void

readorderidset()

synchronized

(lock)條",

collectionutils

.size

(orderidset));

// 緩衝區的orderid發kafka訊息

ordermanager.

sendmessage

(orderidset)

;// 清空緩衝區

orderidset.

clear()

;}}@postconstruct

public

void

postconstruct()

}

SpringBoot註解內容的動態配置

大家都知道,註解只能配置常量,在一些構架的開發中,有時候我們需要給註解動態配置一些值,或者想從配置檔案中讀取配置。直接在註解上配置是無法實現的,但是我們可以在拿到註解的值之後,再對這些值進行另外的操作。比如在註解上面配置佔位符,在使用的時候,再對這些佔位符進行替換。在rocketmq的監聽配置中,就...

springboot 動態多資料來源配置

1.鋪墊 儲存及獲取資料源 dynamicdatasourcecontextholder 這個類,起到承上啟下的作用,後邊aop切換時,會首先setdatasourcetype,在使用時進行getgetdatasourcetype,同時掃瞄環境時,下面的dynamicdatasourceregist...

SpringBoot靜態動態

在src main resources下面有兩個資料夾,static和templates springboot預設 static中放靜態頁面,而templates中放動態頁面 靜態頁面 這裡我們直接在static放乙個hello.html,然後直接輸入http localhost 8080 hell...