看到這個標題,相信不少人會感到疑惑,回憶你們自己的場景會發現,在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上下文:
/**
* created by administrator on 2016/8/18.
* 設定sping的上下文
*/@component
@override
}public static t getbean(string name,classaclass)
}
然後定義我們的自己的執行緒類,注意此類是原型作用域,不能是預設的單例:
@component("mtask")
@scope("prototype")
public class moniotrtask extends thread
@resource(name = "greaterdaoimpl")
private ruledao greaterdaoimpl;
@override
public void run()
}
寫個測試例子,測試下使用springcontext獲取bean,檢視是否是多例項:
/**
* created by administrator on 2016/8/18.
*/@runwith(springjunit4classrunner.class)
public class spingcontexttest
}
執行結果如下:
[ 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
可以看到我們的監控類是多例項的,它裡面的dao是單例項的,這樣以來我們就可以在spring中使用多執行緒處理我們的任務了。
如何啟動我們的多執行緒任務類,可以專門定義乙個元件類啟動也可以在啟動spring的main方法中啟動,下面看下,如何定義元件啟動:
@component
public class starttask ",list.size());
for(int i=0;i"第{}個監控task: {}啟動 !",(i+1),list.get(i).getname());}}
}
最後備忘下logback.xml,裡面可以配置相對和絕對的日誌檔案路徑:
[ %-5level] [%date] %logger [%line] - %msg%n
pattern>
utf-8charset>
encoder>
logs/xalert-%d.%i.logfilenamepattern>
class="ch.qos.logback.core.rolling.sizeandtimebasedfnatp">
64 mbmaxfilesize>
timebasedfilenamingandtriggeringpolicy>
rollingpolicy>
debuglevel>
filter>
trueprudent>
[ %-5level] [%date] %logger [%line] - %msg%n
pattern>
utf-8charset>
encoder>
infolevel>
filter>
by default, only log at level info and above. -->
root>
configuration
Spring Boot中如何使用多執行緒處理任務
img size medium size medium 看到這個標題,相信不少人會感到疑惑,回憶你們自己的場景會發現,在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...