總結 13 Spring執行緒池和Quartz

2021-10-01 20:32:46 字數 3289 閱讀 4852

這裡主要是對springboot的執行緒池使用和quartz使用進行簡單的介紹

我們主要對執行緒池的核心執行緒數、最大執行緒數和工作佇列大小進行配置

# taskexecutionproperties

# 隨著客戶端不斷提交任務,當前執行緒池大小也相應增加。在當前執行緒池大小達到核心執行緒池大小的時候,

# 新來的任務會被存入到工作者佇列中。當工作佇列滿的時候,執行緒池會繼續建立新的工作者執行緒,

# 直到當前執行緒池大小達到最大執行緒池大小。當執行緒池飽和時,

# 即工作者佇列已滿且當前執行緒池大小達到最大執行緒池的情況下,客戶端試圖提交任務會被拒絕。

spring.task.execution.pool.core-size=5

spring.task.execution.pool.max-size=15

spring.task.execution.pool.queue-capacity=100

# taskschedulingproperties

spring.task.scheduling.pool.size=5

然後宣告乙個配置類,使用@enablescheduling和@enableasync註解啟動定時和非同步

@configuration

@enablescheduling

@enableasync

public

class

threadpoolconfig

然後在具體的task上面使用@async表示是非同步操作,@schedule表示是定時任務,initialdelay表示啟動延遲,fixedrate表示兩次任務開始的間隔,單位都是毫秒

// 可以讓該方法在多執行緒環境下被非同步呼叫

@async

public

void

execute1()

@scheduled

(initialdelay =

10000

, fixedrate =

1000

)public

void

execute2()

對於非同步任務我們只要直接呼叫任務即可,而定時任務不需要呼叫

public

void

testthreadpooltaskexecutor******()

sleep

(10000);

}

quartz有三個要素,分別是schedule、trigger和jobdetail+job

scheduler:排程器。所有的排程都是由它控制。

trigger: 觸發器。決定什麼時候來執行任務。

jobdetail & job: jobdetail定義的是任務資料,而真正的執行邏輯是在job中。使用jobdetail + job而不是job,這是因為任務是有可能併發執行,如果scheduler直接使用job,就會存在對同乙個job例項併發訪問的問題。而jobdetail & job 方式,sheduler每次執行,都會根據jobdetail建立乙個新的job例項,這樣就可以規避併發訪問的問題。

# quartzproperties

spring.quartz.job-store-type=jdbc

spring.quartz.scheduler-name=communityscheduler

spring.quartz.properties.org.quartz.scheduler.instanceid=auto

spring.quartz.properties.org.quartz.jobstore.class=org.quartz.impl.jdbcjobstore.jobstoretx

spring.quartz.properties.org.quartz.jobstore.driverdelegateclass=org.quartz.impl.jdbcjobstore.stdjdbcdelegate

spring.quartz.properties.org.quartz.jobstore.isclustered=true

spring.quartz.properties.org.quartz.threadpool.class=org.quartz.simpl.******threadpool

spring.quartz.properties.org.quartz.threadpool.threadcount=5

這樣就能實現對quartz配置的持久化儲存,否則程式會從記憶體中得到quartz的配置資訊。

接下來,我們定義乙個簡單的job,實現job介面,即實現execute方法

public

class

alphajob

implements

job}

然後我們還需要對jobdetail和trigger進行配置,這些配置在執行之後會被寫入資料庫進行儲存。

配置jobdetail我們使用jobdetailfactorybean例項,該例項封裝了jobdetail的例項化過程,我們只要配置setjobclass(指定任務),設定名字,設定組名和任務是否永久儲存、任務是否可以恢復等引數即可完成對jobdetailfactorybean的配置,然後該例項中就會有乙個按我們配置的jobdetail。

配置trigger我們也是使用******trigge***ctorybean,傳入jobdetailfactorybean得到它管理的jobdetail,然後設定setjobdetail、setname、setgroup、重複頻率和jobdatamap(不太清楚)即可。

@configuration

public

class

quartzconfig

// 配置trigger() ******trigge***ctorybean crontrigge***ctorybean

@bean

public ******trigge***ctorybean alphatrigger

(jobdetail alphajobdetail)

}

此時啟動程式,quartz管理的任務就會自動執行,同時資料庫中會有資料被儲存。

當然我們也可以刪除任務,呼叫schedule的deletejob刪除方法即可。

public

class

quartztests

catch

(schedulerexception e)

}}

Spring 執行緒池

spring 執行緒池 從例子開始講 corepoolsize 執行緒池至少有2個執行緒是啟動的,即使是空閒的也不會關閉。maxpoolsize 最大的執行緒數目,當corepoolsize繁忙時,會建立執行緒,啟動的總的執行緒數不能大於maxpoolsize queuecapacity queue...

Spring執行緒池配置

1 配置檔案中配置執行緒池 class org.springframework.scheduling.concurrent.threadpooltaskexecutor corepoolsize 執行緒池至少有2個執行緒是啟動的,即使是空閒的也不會關閉。maxpoolsize 最大的執行緒數目,當c...

Spring整合執行緒池

自己在程式中手動new很容易造成執行緒濫用,建立執行緒也是比較消耗資源的操作,所以建議如果有此需求,將執行緒池統一交給spring框架進行管理。如下 bean id taskexecutor class org.springframework.scheduling.concurrent.thread...