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

2022-02-15 07:53:50 字數 2974 閱讀 6174

看到這個標題,相信不少人會感到疑惑,回憶你們自己的場景會發現,在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...