當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Spring Boot 中的异步调用
生活随笔
收集整理的這篇文章主要介紹了
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 中的异步调用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 快速克隆网站利器-teleport ul
- 下一篇: 九阳真经(1-5重)