詳解SpringBoot中異步請求的實(shí)現(xiàn)與并行執(zhí)行
在Spring Boot中實(shí)現(xiàn)異步請求、并行執(zhí)行,可以使用@Async
注解來定義異步方法,同時使用Future
、CompletableFuture
或其他異步處理機(jī)制來處理異步結(jié)果和回調(diào)。以下是實(shí)現(xiàn)這一功能的幾個步驟:
開啟異步支持
首先,需要在Spring Boot應(yīng)用中開啟異步支持。這可以通過在一個配置類上添加@EnableAsync
注解來實(shí)現(xiàn)。AsyncConfig 類開啟異步支持并自定義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ù)
然后,定義一個服務(wù)類,并在其中的方法上使用@Async
注解來標(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("單個任務(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è)這是耗時操作 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
中,我們將添加一個映射來啟動并行任務(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ù)開始執(zhí)行"; } @GetMapping("/waitForSpecificTask") public String waitForSpecificTask() throws Exception { CompletableFuture<String> future = asyncService.processAsync(); // 等待特定任務(wù)完成 String result = future.get(); // 阻塞直到任務(wù)完成 return "特定任務(wù)完成,結(jié)果:" + result; } }
說明
executeTasksInParallel
方法在AsyncService
中啟動了多個并行的異步任務(wù)。這些任務(wù)通過CompletableFuture
并行執(zhí)行。- 在
startParallelTasks
中,我們使用CompletableFuture.allOf
來等待所有任務(wù)完成。allOf
返回一個新的CompletableFuture
,該CompletableFuture
在所有給定的CompletableFutures
完成時完成。 waitForSpecificTask
方法演示了如何等待一個特定的異步任務(wù)完成。使用CompletableFuture.get()
方法可以阻塞當(dāng)前線程直到異步任務(wù)完成,并獲取結(jié)果。
代碼示例展示了如何在Spring Boot應(yīng)用中并行執(zhí)行多個異步任務(wù),并等待特定或所有任務(wù)的完成,充分利用@Async
注解和CompletableFuture
的能力來實(shí)現(xiàn)高效的異步編程模式。
到此這篇關(guān)于詳解SpringBoot中異步請求的實(shí)現(xiàn)與并行執(zhí)行的文章就介紹到這了,更多相關(guān)SpringBoot異步請求內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot項(xiàng)目報錯:"Error?starting?ApplicationContext....
這篇文章主要給大家介紹了關(guān)于SpringBoot項(xiàng)目報錯:“Error?starting?ApplicationContext.?To?display?the?conditions?report?re-run?...”的解決辦法,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08Java漢字轉(zhuǎn)拼音工具類完整代碼實(shí)例
這篇文章主要介紹了java漢字轉(zhuǎn)拼音工具類完整代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-03-03Java實(shí)現(xiàn)inputstream流的復(fù)制代碼實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)inputstream流的復(fù)制代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-02-02

將SpringBoot項(xiàng)目無縫部署到Tomcat服務(wù)器的操作流程

Collections工具類_動力節(jié)點(diǎn)Java學(xué)院整理

Linux中Elasticsearch的安裝詳細(xì)步驟