亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringBoot監(jiān)控Tomcat活動(dòng)線(xiàn)程數(shù)來(lái)判斷是否完成請(qǐng)求處理方式

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

SpringBoot監(jiān)控Tomcat活動(dòng)線(xiàn)程數(shù)來(lái)判斷是否完成請(qǐng)求處理

最近項(xiàng)目中有一個(gè)需求,需要判斷應(yīng)用的請(qǐng)求是否已經(jīng)處理完畢,想了一下,打算通過(guò)定時(shí)任務(wù)定時(shí)監(jiān)控Tomcat的活動(dòng)線(xiàn)程數(shù)來(lái)實(shí)現(xiàn)。

編碼實(shí)現(xiàn)

新建一個(gè)SpringBoot工程,添加定時(shí)任務(wù)定時(shí)監(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);
? ? }

}

測(cè)試

新建一個(gè)測(cè)試請(qǐng)求類(lèi),代碼如下:

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";
? ? }

}

啟動(dòng)項(xiàng)目:

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]

訪問(wèn)測(cè)試接口,觀察Tomcat線(xiàn)程池變化:

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]

可以看到,當(dāng)有請(qǐng)求處理時(shí),Tomcat的活動(dòng)線(xiàn)程數(shù)不為0,處理完成以后回歸到0,所以可以通過(guò)活動(dòng)線(xiàn)程數(shù)判斷當(dāng)前Tomcat是否有請(qǐng)求還在處理,當(dāng)然,應(yīng)用到實(shí)際業(yè)務(wù)中,還有需要完善的地方。

Tomcat線(xiàn)程數(shù)占滿(mǎn)而導(dǎo)致的線(xiàn)上事故

事故表現(xiàn)形式

昨天下午4點(diǎn)多的時(shí)候,有同學(xué)反映說(shuō),某個(gè)服務(wù)響應(yīng)時(shí)間過(guò)長(zhǎng),懷疑是負(fù)載均衡的問(wèn)題。

排查過(guò)程

1,查看阿里云負(fù)載均衡表現(xiàn)正常,排除。

2,查看單臺(tái)服務(wù)日志出現(xiàn)OOM,可以斷定是服務(wù)出問(wèn)題了。

分析原因

1,先重啟服務(wù)。

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

3,結(jié)果明顯指示tomcat線(xiàn)程池滿(mǎn)了,并指向了其中一個(gè)controller的外部請(qǐng)求。

4,結(jié)合代碼分析是請(qǐng)求外部HTTP連接沒(méi)有設(shè)置超時(shí)時(shí)間,導(dǎo)致大量請(qǐng)求堆積,tomcat線(xiàn)程池滿(mǎn)了,造成OOM。

解決辦法

1,HTTP請(qǐng)求使用連接池,設(shè)置超時(shí)響應(yīng)時(shí)間

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

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論