您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“Java SpringBoot @Async如何實(shí)現(xiàn)異步任務(wù)”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
依賴pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.7</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project>
應(yīng)用啟動類
package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
同步任務(wù),耗時(shí)2秒
package com.example.demo.service; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.AsyncResult; import org.springframework.stereotype.Service; import java.util.concurrent.Future; @Service @Slf4j public class TaskService { /** * 同步任務(wù) * @throws InterruptedException */ public void syncTask() throws InterruptedException { Thread.sleep(1000 * 2); System.out.println("syncTask"); } }
控制器
package com.example.demo.controller; import com.example.demo.service.TaskService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; @RestController @RequestMapping("/task") @Slf4j public class TaskController { @Autowired private TaskService taskService; @GetMapping("/syncTask") public String syncTask() throws InterruptedException { long start = System.currentTimeMillis(); taskService.syncTask(); long end = System.currentTimeMillis(); log.info("time: {}", end - start); return "success"; } }
請求接口:等待2秒后返回
GET http://localhost:8080/task/syncTask Accept: application/json·
啟動類需要加上注解:@EnableAsync
package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableAsync; @SpringBootApplication @EnableAsync public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
異步任務(wù)
package com.example.demo.service; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.AsyncResult; import org.springframework.stereotype.Service; import java.util.concurrent.Future; @Service @Slf4j public class TaskService { /** * 異步任務(wù) * @throws InterruptedException */ @Async public void asyncTask() throws InterruptedException { Thread.sleep(1000 * 2); System.out.println("asyncTask"); } }
控制器
package com.example.demo.controller; import com.example.demo.service.TaskService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; @RestController @RequestMapping("/task") @Slf4j public class TaskController { @Autowired private TaskService taskService; @GetMapping("/asyncTask") public String asyncTask() throws InterruptedException { long start = System.currentTimeMillis(); taskService.asyncTask(); long end = System.currentTimeMillis(); log.info("time: {}", end - start); return "success"; } }
請求接口:無等待,直接返回
GET http://localhost:8080/task/asyncTask Accept: application/json
異步任務(wù)
package com.example.demo.service; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.AsyncResult; import org.springframework.stereotype.Service; import java.util.concurrent.Future; @Service @Slf4j public class TaskService { /** * 異步任務(wù), 有返回值 * @throws InterruptedException */ @Async public Future<String> asyncTaskFuture() throws InterruptedException { Thread.sleep(1000 * 2); System.out.println("asyncTaskFuture"); return new AsyncResult<>("asyncTaskFuture"); } }
控制器
package com.example.demo.controller; import com.example.demo.service.TaskService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; @RestController @RequestMapping("/task") @Slf4j public class TaskController { @Autowired private TaskService taskService; @GetMapping("/asyncTaskFuture") public String asyncTaskFuture() throws InterruptedException, ExecutionException { long start = System.currentTimeMillis(); Future<String> future = taskService.asyncTaskFuture(); // 線程等待結(jié)果返回 String result = future.get(); long end = System.currentTimeMillis(); log.info("time: {}", end - start); return result; } }
請求接口:等待2秒后返回
GET http://localhost:8080/task/asyncTaskFuture Accept: application/json
package com.example.demo.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import java.util.concurrent.Executor; import java.util.concurrent.ThreadPoolExecutor; /** * 自定義線程池 */ @Configuration public class ExecutorAsyncConfig { @Bean(name = "newAsyncExecutor") public Executor newAsync() { ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); // 設(shè)置核心線程數(shù) taskExecutor.setCorePoolSize(10); // 線程池維護(hù)線程的最大數(shù)量,只有在緩沖隊(duì)列滿了以后才會申請超過核心線程數(shù)的線程 taskExecutor.setMaxPoolSize(100); // 緩存隊(duì)列 taskExecutor.setQueueCapacity(50); // 允許的空閑時(shí)間,當(dāng)超過了核心線程數(shù)之外的線程在空閑時(shí)間到達(dá)之后會被銷毀 taskExecutor.setKeepAliveSeconds(200); // 異步方法內(nèi)部線程名稱 taskExecutor.setThreadNamePrefix("my-xiaoxiao-AsyncExecutor-"); // 拒絕策略 taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); taskExecutor.initialize(); return taskExecutor; } }
異步任務(wù)
package com.example.demo.service; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.AsyncResult; import org.springframework.stereotype.Service; import java.util.concurrent.Future; @Service @Slf4j public class TaskService { /** * 自定義線程池 執(zhí)行異步任務(wù) * @throws InterruptedException */ @Async("newAsyncExecutor") public void asyncTaskNewAsync() throws InterruptedException { Thread.sleep(1000 * 2); System.out.println("asyncTaskNewAsync"); } }
控制器
package com.example.demo.controller; import com.example.demo.service.TaskService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; @RestController @RequestMapping("/task") @Slf4j public class TaskController { @Autowired private TaskService taskService; @GetMapping("/asyncTaskNewAsync") public String asyncTaskNewAsync() throws InterruptedException { long start = System.currentTimeMillis(); taskService.asyncTaskNewAsync(); long end = System.currentTimeMillis(); log.info("time: {}", end - start); return "success"; } }
請求接口:無等待,直接返回
GET http://localhost:8080/task/asyncTaskNewAsync Accept: application/json
不需要在啟動類上加@EnableAsync
注解,也不需要在方法上加@Async
注解
控制器
package com.example.demo.controller; import com.example.demo.service.TaskService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; @RestController @RequestMapping("/task") @Slf4j public class TaskController { @GetMapping("/completableFuture") public String completableFuture(){ long start = System.currentTimeMillis(); // CompletableFuture實(shí)現(xiàn)異步任務(wù) CompletableFuture<Void> result = CompletableFuture.runAsync(() -> { try { Thread.sleep(1000 * 2); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("CompletableFuture"); }); long end = System.currentTimeMillis(); log.info("time: {}", end - start); return "success"; } }
“Java SpringBoot @Async如何實(shí)現(xiàn)異步任務(wù)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。