日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring Boot 中的异步调用

發布時間:2024/3/24 javascript 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Boot 中的异步调用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Spring Boot 中的異步調用

通常我們開發的程序都是同步調用的,即程序按照代碼的順序一行一行的逐步往下執行,每一行代碼都必須等待上一行代碼執行完畢才能開始執行。而異步編程則沒有這個限制,代碼的調用不再是阻塞的。所以在一些情景下,通過異步編程可以提高效率,提升接口的吞吐量。這節將介紹如何在Spring Boot中進行異步編程。
要開啟異步支持,首先得在Spring Boot入口類上加上@EnableAsync注解:
@SpringBootApplication @EnableAsync public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);} }
新建service包,并創建TestService:
@Service public class TestService {private Logger logger = LoggerFactory.getLogger(this.getClass());@Asyncpublic void asyncMethod() {sleep();logger.info("異步方法內部線程名稱:{}", Thread.currentThread().getName());}public void syncMethod() {sleep();}private void sleep() {try {TimeUnit.SECONDS.sleep(2);} catch (InterruptedException e) {e.printStackTrace();}} }
上面的Service中包含一個異步方法asyncMethod(開啟異步支持后,只需要在方法上加上@Async注解便是異步方法了)和同步方法syncMethod。sleep方法用于讓當前線程阻塞2秒鐘。
因為異步的原因,程序并沒有被sleep方法阻塞,這就是異步調用的好處。同時異步方法內部會新啟一個線程來執行
默認情況下的異步線程池配置使得線程不能被重用,每次調用異步方法都會新建一個線程,我們可以自己定義異步線程池來優化。
@Configuration public class AsyncPoolConfig {@Beanpublic ThreadPoolTaskExecutor asyncThreadPoolTaskExecutor(){ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(20);executor.setMaxPoolSize(200);executor.setQueueCapacity(25);executor.setKeepAliveSeconds(200);executor.setThreadNamePrefix("asyncThread");executor.setWaitForTasksToCompleteOnShutdown(true);executor.setAwaitTerminationSeconds(60);executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());executor.initialize();return executor;} }
要使用該線程池,只需要在@Async注解上指定線程池Bean名稱即可:
@Service public class TestService {......@Async("asyncThreadPoolTaskExecutor")public void asyncMethod() {......}...... }

處理異步回調

如果異步方法具有返回值的話,需要使用Future來接收回調值。我們修改TestService的asyncMethod方法,給其添加返回值:
@Async("asyncThreadPoolTaskExecutor") public Future<String> asyncMethod() {sleep();logger.info("異步方法內部線程名稱:{}", Thread.currentThread().getName());return new AsyncResult<>("hello async"); }
Future接口的get方法用于獲取異步調用的返回值。
通過返回結果我們可以看出Future的get方法為阻塞方法,只有當異步方法返回內容了,程序才會繼續往下執行。get還有一個get(long timeout, TimeUnit unit)重載方法,我們可以通過這個重載方法設置超時時間,即異步方法在設定時間內沒有返回值的話,直接拋出java.util.concurrent.TimeoutException異常。
比如設置超時時間為60秒:
String result = stringFuture.get(60, TimeUnit.SECONDS);

總結

以上是生活随笔為你收集整理的Spring Boot 中的异步调用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。