這裡主要是對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...