[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...