Spring Boot中如何使用多執行緒處理任務

2021-09-02 16:18:26 字數 2181 閱讀 3240

[img]

[size=medium]

[size=medium]看到這個標題,相信不少人會感到疑惑,回憶你們自己的場景會發現,在spring的專案中很少有使用多執行緒處理任務的,沒錯,大多數時候我們都是使用spring mvc開發的web專案,預設的controller,service,dao元件的作用域都是單例項,無狀態,然後被併發多執行緒呼叫,那麼如果我想使用多執行緒處理任務,該如何做呢?

比如如下場景:

使用spring-boot開發乙個監控的專案,每個被監控的業務(可能是乙個資料庫表或者是乙個pid程序)都會單獨執行在乙個執行緒中,有自己配置的引數,總結起來就是:

(1)多例項(多個業務,每個業務相互隔離互不影響)

(2)有狀態(每個業務,都有自己的配置引數)

如果是非spring-boot專案,實現起來可能會相對簡單點,直接new多執行緒啟動,然後傳入不同的引數類即可,在spring的專案中,由於bean物件是spring容器管理的,你直接new出來的物件是沒法使用的,就算你能new成功,但是bean裡面依賴的其他元件比如dao,是沒法初始化的,因為你饒過了spring,預設的spring初始化乙個類時,其相關依賴的元件都會被初始化,但是自己new出來的類,是不具備這種功能的,所以我們需要通過spring來獲取我們自己的執行緒類,那麼如何通過spring獲取類例項呢,需要定義如下的乙個類來獲取springcontext上下文:[/size]

[size=medium]然後定義我們的自己的執行緒類,注意此類是原型作用域,不能是預設的單例:[/size]

@component("mtask")

@scope("prototype")

public class moniotrtask extends thread

@resource(name = "greaterdaoimpl")

private ruledao greaterdaoimpl;

@override

public void run()

}

[size=medium]寫個測試例子,測試下使用springcontext獲取bean,檢視是否是多例項:[/size]

[size=medium]執行結果如下:[/size]

[ info ] [2016-08-25 17:36:34] com.test.tools.spingcontexttest [57] - started spingcontexttest in 2.902 seconds (jvm running for 4.196)

2016-08-25 17:36:34.842 info 8312 --- [ main] com.test.tools.spingcontexttest : started spingcontexttest in 2.902 seconds (jvm running for 4.196)

thread[thread-2,5,main] => com.xuele.bigdata.xalert.dao.rule.impl.greaterdaoimpl@285f38f6

thread[thread-3,5,main] => com.xuele.bigdata.xalert.dao.rule.impl.greaterdaoimpl@285f38f6

thread[thread-4,5,main] => com.xuele.bigdata.xalert.dao.rule.impl.greaterdaoimpl@285f38f6

[size=medium]可以看到我們的監控類是多例項的,它裡面的dao是單例項的,這樣以來我們就可以在spring中使用多執行緒處理我們的任務了。

如何啟動我們的多執行緒任務類,可以專門定義乙個元件類啟動也可以在啟動spring的main方法中啟動,下面看下,如何定義元件啟動:[/size]

[size=medium]最後備忘下logback.xml,裡面可以配置相對和絕對的日誌檔案路徑:[/size]

utf-8

logs/xalert-%d.%i.log

64 mb

debug

true

utf-8

info

[b][color=green][size=large]

技術債不能欠,健康債更不能欠, 求道之路,與君同行。

[/size][/color][/b]

[img]

Spring Boot中如何使用多執行緒處理任務

看到這個標題,相信不少人會感到疑惑,回憶你們自己的場景會發現,在spring的專案中很少有使用多執行緒處理任務的,沒錯,大多數時候我們都是使用spring mvc開發的web專案,預設的controller,service,dao元件的作用域都是單例項,無狀態,然後被併發多執行緒呼叫,那麼如果我想使...

Springboot如何使用AOP

切面的包 1 springboot 不自帶aop 需要自己新增依賴 org.springframework.bootgroupid spring boot starter aopartifactid dependency 2 直接 aspect寫切面類就行了1 連線點 可以理解為需要被增強的方法 2...

Spring Boot中如何使用過濾器

1,定義過濾器和設定呼叫順序 假設定義兩個過濾器 1,事物過濾器 開啟和提交事物操作 2,請求響應日誌過濾器 記錄請求和響應日誌和原始過濾器一樣,我們需要實現filter介面 component order 1 public class transactionfilter implements fi...