詳解SpringBoot中異步請(qǐng)求的實(shí)現(xiàn)與并行執(zhí)行
在Spring Boot中實(shí)現(xiàn)異步請(qǐng)求、并行執(zhí)行,可以使用@Async注解來(lái)定義異步方法,同時(shí)使用Future、CompletableFuture或其他異步處理機(jī)制來(lái)處理異步結(jié)果和回調(diào)。以下是實(shí)現(xiàn)這一功能的幾個(gè)步驟:
開(kāi)啟異步支持
首先,需要在Spring Boot應(yīng)用中開(kāi)啟異步支持。這可以通過(guò)在一個(gè)配置類(lèi)上添加@EnableAsync注解來(lái)實(shí)現(xiàn)。AsyncConfig 類(lèi)開(kāi)啟異步支持并自定義Executor
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(2);
executor.setMaxPoolSize(5);
executor.setQueueCapacity(100);
executor.setThreadNamePrefix("Async-");
executor.initialize();
return executor;
}
}
定義異步服務(wù)
然后,定義一個(gè)服務(wù)類(lèi),并在其中的方法上使用@Async注解來(lái)標(biāo)記它們?yōu)楫惒椒椒?。這里可以返回Future、CompletableFuture或ListenableFuture等,以便處理異步結(jié)果。
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
@Service
public class AsyncService {
@Async
public CompletableFuture<String> processAsync() {
// 模擬異步任務(wù)
try {
Thread.sleep(1000);
return CompletableFuture.completedFuture("單個(gè)任務(wù)執(zhí)行完成");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return CompletableFuture.failedFuture(e);
}
}
@Async
public CompletableFuture<String> processAsyncParallel(int taskNumber) {
// 模擬異步任務(wù)
try {
Thread.sleep(1000); // 假設(shè)這是耗時(shí)操作
return CompletableFuture.completedFuture("任務(wù) #" + taskNumber + " 執(zhí)行完成");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return CompletableFuture.failedFuture(e);
}
}
public List<CompletableFuture<String>> executeTasksInParallel() {
List<CompletableFuture<String>> futures = new ArrayList<>();
for (int i = 0; i < 5; i++) {
futures.add(processAsyncParallel(i));
}
return futures;
}
}
在Controller中調(diào)用并行執(zhí)行方法并等待所有任務(wù)完成
在AsyncController中,我們將添加一個(gè)映射來(lái)啟動(dòng)并行任務(wù)并等待它們?nèi)客瓿伞?/p>
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
@RestController
public class AsyncController {
@Autowired
private AsyncService asyncService;
@GetMapping("/startParallelTasks")
public String startParallelTasks() {
List<CompletableFuture<String>> futures = asyncService.executeTasksInParallel();
// 等待所有任務(wù)完成
CompletableFuture<Void> allDoneFuture = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]))
.thenApply(v -> futures.stream()
.map(CompletableFuture::join)
.collect(Collectors.toList()));
allDoneFuture.thenAccept(results -> results.forEach(System.out::println));
return "并行任務(wù)開(kāi)始執(zhí)行";
}
@GetMapping("/waitForSpecificTask")
public String waitForSpecificTask() throws Exception {
CompletableFuture<String> future = asyncService.processAsync();
// 等待特定任務(wù)完成
String result = future.get(); // 阻塞直到任務(wù)完成
return "特定任務(wù)完成,結(jié)果:" + result;
}
}
說(shuō)明
executeTasksInParallel方法在AsyncService中啟動(dòng)了多個(gè)并行的異步任務(wù)。這些任務(wù)通過(guò)CompletableFuture并行執(zhí)行。- 在
startParallelTasks中,我們使用CompletableFuture.allOf來(lái)等待所有任務(wù)完成。allOf返回一個(gè)新的CompletableFuture,該CompletableFuture在所有給定的CompletableFutures完成時(shí)完成。 waitForSpecificTask方法演示了如何等待一個(gè)特定的異步任務(wù)完成。使用CompletableFuture.get()方法可以阻塞當(dāng)前線(xiàn)程直到異步任務(wù)完成,并獲取結(jié)果。
代碼示例展示了如何在Spring Boot應(yīng)用中并行執(zhí)行多個(gè)異步任務(wù),并等待特定或所有任務(wù)的完成,充分利用@Async注解和CompletableFuture的能力來(lái)實(shí)現(xiàn)高效的異步編程模式。
到此這篇關(guān)于詳解SpringBoot中異步請(qǐng)求的實(shí)現(xiàn)與并行執(zhí)行的文章就介紹到這了,更多相關(guān)SpringBoot異步請(qǐng)求內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot項(xiàng)目報(bào)錯(cuò):"Error?starting?ApplicationContext....
這篇文章主要給大家介紹了關(guān)于SpringBoot項(xiàng)目報(bào)錯(cuò):“Error?starting?ApplicationContext.?To?display?the?conditions?report?re-run?...”的解決辦法,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08
Java漢字轉(zhuǎn)拼音工具類(lèi)完整代碼實(shí)例
這篇文章主要介紹了java漢字轉(zhuǎn)拼音工具類(lèi)完整代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
Java實(shí)現(xiàn)inputstream流的復(fù)制代碼實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)inputstream流的復(fù)制代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02
將SpringBoot項(xiàng)目無(wú)縫部署到Tomcat服務(wù)器的操作流程
Java加載與存儲(chǔ)指令之ldc與_fast_aldc指令
Collections工具類(lèi)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
Linux中Elasticsearch的安裝詳細(xì)步驟

