欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springboot如何實現(xiàn)異步響應請求(前端請求超時的問題解決)

 更新時間:2023年01月30日 10:10:54   作者:奮斗魚  
這篇文章主要給大家介紹了關(guān)于springboot如何實現(xiàn)異步響應請求(前端請求超時的問題解決)的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家學習或者使用springboot具有一定的參考學習價值,需要的朋友可以參考下

問題

實際場景中會遇到請求業(yè)務處理流程耗時較長,比如長查詢,遠程調(diào)用等,主線程會被一直占用會影響其他請求的響應,導致服務端性能下降。同時,前端向服務端發(fā)送請求后等待響應的超時時間比較短(一般20s或30s),而我們實際業(yè)務執(zhí)行可能超過1分鐘。所以以下需要解決此問題。

解決方案

解決的方案分為以下兩步驟

1.服務端異步處理

你需要將請求接口進行一些簡單的改進。將返回值類型變更為Callable<T>類型,其中T可以為任意類型比如String或你原有的自定義類型。以下的new Callable方法,會新建一個線程,用于執(zhí)行業(yè)務邏輯并在得到結(jié)果后自動返回給前端。而主線程無需等待。

    @RequestMapping(value = "/GetMonthCdateRpt", method = RequestMethod.POST)
    @ResponseBody
    public Callable<String> GetMonthCdateRpt(@RequestBody HashMap<String, Object> map) {
        logger.info("主線程開始");
        Callable<String> result = new Callable<String>() {
            @Override
            public String call() throws Exception {
                logger.info("副線程開始");
                /*這里沉睡1分鐘,表示處理耗時業(yè)務執(zhí)行*/
                Thread.sleep(60000);
                logger.info("副線程返回");
                return "success";
            }
        };
        logger.info("主線程返回");
        return result;
    }

2.設置響應時間

改進完接口方法后,你需要新建一個WebMvcConfigurer的實現(xiàn)類,名字可以為WebAppConfigurer.java實現(xiàn)異步處理的支持,如果你已存在其他WebMvcConfigurer的類,則可以把代碼追加進去。代碼內(nèi)容如下:

@Configuration
public class WebAppConfigurer implements WebMvcConfigurer {
 
    //異步處理支持
    @Override
    public void configureAsyncSupport(final AsyncSupportConfigurer configurer) {
        configurer.setDefaultTimeout(120 * 1000L);//設置響應時間 120s
        configurer.registerCallableInterceptors(timeoutInterceptor());
        configurer.setTaskExecutor(threadPoolTaskExecutor());
    }
    @Bean
    public TimeoutCallableProcessingInterceptor timeoutInterceptor() {
        return new TimeoutCallableProcessingInterceptor();
    }
    @Bean
    public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
        ThreadPoolTaskExecutor t = new ThreadPoolTaskExecutor();
        t.setCorePoolSize(10);
        t.setMaxPoolSize(100);
        t.setQueueCapacity(20);
        t.setThreadNamePrefix("WYF-Thread-");
        return t;
    }
}

執(zhí)行完以上兩步驟后,重新運行服務,調(diào)用接口可以異步返回結(jié)果,前端可以最大等待的響應時間為上面設置的120s。

問題已解決。

需要避免踩到的坑

如果你按上文操作后,還是會出現(xiàn)超時情況,有可能是你用到了以下幾種軟件,需要對應設置一下。

1.關(guān)于dubbo中的設置

如果你使用的了dubbo這樣的Jave RPC框架,你除了以上設置后,還需要在application-*.yml配置消費端的默認的響應超時時長。

dubbo:
  application:
    name: myweb
 
  consumer:
    timeout: 120000 #默認超時時間120s

同時注意在dubbo的*consume-client.xml服務注冊中,如果單個服務也設置了timeout會以各自服務配置的超時時長為準。如下的timeout是20秒,需要修改或直接刪掉此timeout的設置。

    <dubbo:reference id="reportUserInfoService"
                     interface="com.zh.fee.service.UserInfoService" timeout="20000"
                     retries="0" check="false"/>

2.關(guān)于tomcat的設置

上文中是springboot開發(fā)環(huán)境,使用了內(nèi)置的tomcat。而在實際生產(chǎn)環(huán)境中一般用的是外置tomcat來部署(便于后續(xù)發(fā)布更新),需要在tomcat的配置文件server.xml中設置超時時間(默認20秒以下設置為120秒)。

    <Connector port="8811" protocol="HTTP/1.1"
               connectionTimeout="120000"
               redirectPort="8443" />

3.關(guān)于Nginx的設置

如果服務端使用到Nginx做了反向代理轉(zhuǎn)發(fā)請求,就需要在Nginx的配置文件nginx.conf中設置超時時間,否則會返回“java.io.IOException: 你的主機中的軟件中止了一個已建立的連接”這樣的異常提示。

未設置時Nginx響應時間默認60秒,這里我將http頭部的keepalive_timeout 、client_header_timeout 、client_body_timeout 、send_timeout 、以及server代碼塊中的proxy_read_timeout 均配置為120秒。

http {
    include       mime.types;
    default_type  application/octet-stream;
    client_max_body_size 100m;
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
 
    #access_log  logs/access.log  main;
 
    sendfile        on;
    #tcp_nopush     on;
 
    keepalive_timeout  120; #連接超時時間,服務器將會在這個時間后關(guān)閉連接
    send_timeout 120;    #發(fā)送超時時間
    client_header_timeout 120;    #請求頭的超時時間
    client_body_timeout 120;    #請求體的讀超時時間
    #gzip  on;
 
.....
 
    #業(yè)務系統(tǒng)的配置
    server {
        listen       9092;
        server_name  localhost;
	
    	location / {
             proxy_pass http://127.0.0.1:8811/mywebsev/;
	         proxy_read_timeout 120;  # 等候后端服務器響應時間 秒
            }
    }
}

保存完記得重啟Nginx。

以上完畢。

總結(jié)

到此這篇關(guān)于springboot如何實現(xiàn)異步響應請求(前端請求超時的問題解決)的文章就介紹到這了,更多相關(guān)springboot實現(xiàn)異步響應請求內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 分析并發(fā)編程之LongAdder原理

    分析并發(fā)編程之LongAdder原理

    LongAdder類是JDK1.8新增的一個原子性操作類。AtomicLong通過CAS算法提供了非阻塞的原子性操作,相比受用阻塞算法的同步器來說性能已經(jīng)很好了,但是JDK開發(fā)組并不滿足于此,因為非常搞并發(fā)的請求下AtomicLong的性能是不能讓人接受的
    2021-06-06
  • Java的靜態(tài)類型檢查示例代碼詳解

    Java的靜態(tài)類型檢查示例代碼詳解

    本文將使用幾個代碼示例,深入講解Java中的類型檢查機制。一旦完全理解了本文的例子,就完全掌握了Java中的靜態(tài)類型檢查,感興趣的朋友一起看看吧
    2017-11-11
  • 淺談Java三大框架與應用

    淺談Java三大框架與應用

    這篇文章主要介紹了淺談Java三大框架與應用,需要的朋友可以參考下
    2015-05-05
  • SpringBoot整合mysql、postgres及sqlserver實現(xiàn)多數(shù)據(jù)源配置實戰(zhàn)案例

    SpringBoot整合mysql、postgres及sqlserver實現(xiàn)多數(shù)據(jù)源配置實戰(zhàn)案例

    在工作中業(yè)務的發(fā)展或業(yè)務數(shù)據(jù)隔離的場景下,通常需要一個項目中引入多個數(shù)據(jù)源,但SpringBoot默認的自動化配置是單數(shù)據(jù)源的,這篇文章主要給大家介紹了關(guān)于SpringBoot整合mysql、postgres及sqlserver實現(xiàn)多數(shù)據(jù)源配置的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • 解讀JDK、JRE、JVM的區(qū)別與聯(lián)系

    解讀JDK、JRE、JVM的區(qū)別與聯(lián)系

    這篇文章主要介紹了解讀JDK、JRE、JVM的區(qū)別與聯(lián)系,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 面試官:java ThreadLocal真的會造成內(nèi)存泄露嗎

    面試官:java ThreadLocal真的會造成內(nèi)存泄露嗎

    ThreadLocal,java面試過程中的“釘子戶”,在網(wǎng)上也充斥著各種有關(guān)ThreadLocal內(nèi)存泄露的問題,本文換個角度,先思考ThreadLocal體系中的ThreadLocalMap為什么要設計成弱引用
    2021-08-08
  • java高效讀大文件(csv,text)的幾種處理方式

    java高效讀大文件(csv,text)的幾種處理方式

    這篇文章主要給大家介紹了關(guān)于java高效讀大文件(csv,text)的幾種處理方式,Java中處理大文件時,通常需要采取一些特定的策略來避免內(nèi)存溢出或性能問題,文中通過代碼及圖片介紹的非常詳細,需要的朋友可以參考下
    2024-07-07
  • Springboot添加jvm監(jiān)控實現(xiàn)數(shù)據(jù)可視化

    Springboot添加jvm監(jiān)控實現(xiàn)數(shù)據(jù)可視化

    這篇文章主要介紹了Springboot添加jvm監(jiān)控實現(xiàn)數(shù)據(jù)可視化,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • java設計模式(實戰(zhàn))-責任鏈模式

    java設計模式(實戰(zhàn))-責任鏈模式

    這篇文章主要介紹了java設計模式(實戰(zhàn))-責任鏈模式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java 8中default方法能做什么?不能做什么?

    Java 8中default方法能做什么?不能做什么?

    這篇文章主要給大家介紹了關(guān)于Java 8中default方法能做什么?不能做什么?文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-04-04

最新評論