最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot監(jiān)控Tomcat活動線程數來判斷是否完成請求處理方式

 更新時間:2023年02月28日 16:44:54   作者:三分魔系  
這篇文章主要介紹了SpringBoot監(jiān)控Tomcat活動線程數來判斷是否完成請求處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

SpringBoot監(jiān)控Tomcat活動線程數來判斷是否完成請求處理

最近項目中有一個需求,需要判斷應用的請求是否已經處理完畢,想了一下,打算通過定時任務定時監(jiān)控Tomcat的活動線程數來實現。

編碼實現

新建一個SpringBoot工程,添加定時任務定時監(jiān)控,代碼如下:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.embedded.tomcat.TomcatWebServer;
import org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class TomcatMonitor {
? ? private Logger logger = LoggerFactory.getLogger(getClass());

? ? @Autowired
? ? ServletWebServerApplicationContext applicationContext;


? ? @Scheduled(cron = "*/1 * * * * ?")
? ? public void execute() {
? ? ? ? TomcatWebServer webServer = (TomcatWebServer) applicationContext.getWebServer();
? ? ? ? String tomcatInfo = webServer.getTomcat().getConnector().getProtocolHandler().getExecutor().toString();

? ? ? ? System.out.println("tomcatInfo: " + tomcatInfo);
? ? }

}

測試

新建一個測試請求類,代碼如下:

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.TimeUnit;

@RestController
public class TestController {

? ? @RequestMapping("/test")
? ? public String test() {
? ? ? ? try {
? ? ? ? ? ? TimeUnit.SECONDS.sleep(2);
? ? ? ? } catch (InterruptedException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? ? ? System.out.println("complete OK");
? ? ? ? return "OK";
? ? }

}

啟動項目:

tomcatInfo: org.apache.tomcat.util.threads.ThreadPoolExecutor@49355b92[Running, pool size = 10, active threads = 0, queued tasks = 0, completed tasks = 0]
tomcatInfo: org.apache.tomcat.util.threads.ThreadPoolExecutor@49355b92[Running, pool size = 10, active threads = 0, queued tasks = 0, completed tasks = 0]

訪問測試接口,觀察Tomcat線程池變化:

tomcatInfo: org.apache.tomcat.util.threads.ThreadPoolExecutor@49355b92[Running, pool size = 10, active threads = 1, queued tasks = 0, completed tasks = 0]
complete OK
tomcatInfo: org.apache.tomcat.util.threads.ThreadPoolExecutor@49355b92[Running, pool size = 10, active threads = 0, queued tasks = 0, completed tasks = 2]

可以看到,當有請求處理時,Tomcat的活動線程數不為0,處理完成以后回歸到0,所以可以通過活動線程數判斷當前Tomcat是否有請求還在處理,當然,應用到實際業(yè)務中,還有需要完善的地方。

Tomcat線程數占滿而導致的線上事故

事故表現形式

昨天下午4點多的時候,有同學反映說,某個服務響應時間過長,懷疑是負載均衡的問題。

排查過程

1,查看阿里云負載均衡表現正常,排除。

2,查看單臺服務日志出現OOM,可以斷定是服務出問題了。

分析原因

1,先重啟服務。

2,下載 *.hprof 日志,用MAT分析結果如下圖:

3,結果明顯指示tomcat線程池滿了,并指向了其中一個controller的外部請求。

4,結合代碼分析是請求外部HTTP連接沒有設置超時時間,導致大量請求堆積,tomcat線程池滿了,造成OOM。

解決辦法

1,HTTP請求使用連接池,設置超時響應時間

2,加上監(jiān)控。

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java Kafka實現優(yōu)先級隊列的示例詳解

    Java Kafka實現優(yōu)先級隊列的示例詳解

    在分布式系統(tǒng)中,消息隊列是一種常見的異步通信機制,而優(yōu)先級隊列則是消息隊列的一種特殊形式,下面我們來看看如何利用Kafka實現優(yōu)先級隊列吧
    2025-03-03
  • eclipse maven 插件的安裝和配置詳解

    eclipse maven 插件的安裝和配置詳解

    這篇文章主要介紹了eclipse maven 插件的安裝和配置詳解,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • 在Eclipse IDE使用Gradle構建應用程序(圖文)

    在Eclipse IDE使用Gradle構建應用程序(圖文)

    這篇文章主要介紹了在Eclipse IDE使用Gradle構建應用程序(圖文),小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • 詳解SpringMVC學習系列(6) 之 數據驗證

    詳解SpringMVC學習系列(6) 之 數據驗證

    這篇文章主要介紹了詳解SpringMVC學習系列(6) 之 數據驗證 ,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2016-12-12
  • java中l(wèi)ist.forEach()和list.stream().forEach()區(qū)別

    java中l(wèi)ist.forEach()和list.stream().forEach()區(qū)別

    這篇文章主要介紹了java中l(wèi)ist.forEach()和list.stream().forEach()區(qū)別,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Java中的List接口實現類解析

    Java中的List接口實現類解析

    這篇文章主要介紹了Java中的List接口實現類解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 詳解Java如何改變字符串中的字符

    詳解Java如何改變字符串中的字符

    這篇文章主要介紹了Java如何改變字符串中的字符,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-05-05
  • SpringBoot切面攔截@PathVariable參數及拋出異常的全局處理方式

    SpringBoot切面攔截@PathVariable參數及拋出異常的全局處理方式

    這篇文章主要介紹了SpringBoot切面攔截@PathVariable參數及拋出異常的全局處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 關于SpringBoot配置文件加載位置的優(yōu)先級

    關于SpringBoot配置文件加載位置的優(yōu)先級

    這篇文章主要介紹了關于SpringBoot配置文件加載位置的優(yōu)先級,我們也可以通過spring.config.location來改變默認的配置文件位置,項目打包好后,我們可以通過命令行的方式在啟動時指定配置文件的位置,需要的朋友可以參考下
    2023-10-10
  • Java線程生命周期及轉換過程

    Java線程生命周期及轉換過程

    這篇文章主要介紹了Java線程生命周期及轉換過程,線程的生命周期指的是線程從創(chuàng)建到銷毀的整個過程初始狀態(tài)、可運行狀態(tài)、運行狀態(tài)、休眠狀態(tài)、終止狀態(tài),更多詳細介紹,需要的小伙伴可以參考下面文章內容
    2022-05-05

最新評論

永丰县| 固镇县| 攀枝花市| 大同市| 长沙市| 三明市| 汶上县| 梨树县| 南和县| 浮山县| 永胜县| 施秉县| 阜阳市| 乌兰察布市| 黄平县| 诸暨市| 阿克陶县| 平乡县| 邵东县| 多伦县| 什邡市| 北宁市| 海口市| 太谷县| 锦屏县| 元氏县| 汤阴县| 广南县| 石楼县| 汉川市| 贡嘎县| 蚌埠市| 丹棱县| 新源县| 上犹县| 谢通门县| 泰宁县| 临颍县| 临沧市| 呼玛县| 遂宁市|