目錄
1.異步任務
1.1.概述
1.2.使用
2.異步消息
2.1.概述
2.2.使用
1.異步任務
1.1.概述
舉一個例子,我現(xiàn)在有一個網(wǎng)上商城,客戶在界面點擊下單后,后臺需要完成兩步:
-
1.創(chuàng)建客戶訂單
-
2.發(fā)短信通知客戶訂單號
這里面第2步是個高耗時的操作,如果全部擠在一條主線程里做,效果就會是客戶點了一下界面的下單按鈕,然后轉(zhuǎn)半天圈,直到客戶收到短信后,界面才停止轉(zhuǎn)圈。
這里面我們發(fā)現(xiàn)其實我們并不需要等第2步完全跑完再返回,只要調(diào)用觸發(fā)低2步就可以返回了。
第2步很適合做成異步任務,只要觸發(fā)了就行,快速給出響應,不讓請求卡在接口上,不必等它完整做完。
1.2.使用
spring提供了一個AsyncConfigurer接口,用來支持我們自定義一個線程池作為異步任務的線程池。
1.AsyncConfigurer接口:
package org.springframework.scheduling.annotation;
import java.util.concurrent.Executor;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.lang.Nullable;
public interface AsyncConfigurer {
//獲取線程池
@Nullable
default Executor getAsyncExecutor() {
return null;
}
//異步異常處理器
@Nullable
default AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return null;
}
}
2.自定義一個異步線程池:
@Configuration
@EnableAsync //開啟Spring對異步的支持
public class AsyncConfig implements AsyncConfigurer {
@Override
public Executor getAsyncExecutor() {
//定義線程池
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
//核心線程數(shù)
taskExecutor.setCorePoolSize(10);
//線程池最大線程數(shù)
taskExecutor.setMaxPoolSize(30);
//線程隊列最大線程數(shù)
taskExecutor.setQueueCapacity(2000);
//初始化
taskExecutor.initialize();
return taskExecutor;
}
}
3.使用異步任務:
用@Async注解的方法會交給自定義的異步線程池來執(zhí)行。
@Async注解的接口只要將任務交給線程池里面的線程后就會快速返回響應,而不會等方法執(zhí)行完。
import org.springframework.scheduling.annotation.Async;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@RequestMapping("test")
@Async
public void test(){
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}
}
2.異步消息
2.1.概述
有時候,點對點的消息傳送可能出現(xiàn)消費能力跟不上生產(chǎn)能力導致數(shù)據(jù)積壓的情況出現(xiàn),這時候異步消息就派上了用場。
以1.1章節(jié)中舉例的場景為例,發(fā)短信的線程和客戶之間就是點對點的,只要訂單下得夠快,線程池很快還是會被打滿:
?這時候我們就需要將這種點對點的同步關(guān)系,通過MQ這個中間層解為異步的關(guān)系:
2.2.使用
異步消息其實本質(zhì)上就是將數(shù)據(jù)放到MQ中,以下是博主寫的用Spring Boot操作rabbitMQ的文章,清晰易懂,可以參考,至于其它MQ的話,術(shù)有千法,道本歸一:文章來源:http://www.zghlxwxcb.cn/news/detail-421780.html
SpringBoot RabbitMq 六大模式_springboot整合rabbitmq六種模式__BugMan的博客-CSDN博客文章來源地址http://www.zghlxwxcb.cn/news/detail-421780.html
到了這里,關(guān)于Spring Boot異步任務、異步消息的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!