溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何使用Arthas 獲取Spring ApplicationContext還原問題現(xiàn)場(chǎng)

發(fā)布時(shí)間:2021-07-09 16:21:45 來源:億速云 閱讀:322 作者:chen 欄目:大數(shù)據(jù)

這篇文章主要介紹“如何使用Arthas 獲取Spring ApplicationContext還原問題現(xiàn)場(chǎng)”,在日常操作中,相信很多人在如何使用Arthas 獲取Spring ApplicationContext還原問題現(xiàn)場(chǎng)問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”如何使用Arthas 獲取Spring ApplicationContext還原問題現(xiàn)場(chǎng)”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

背景

最近來了個(gè)實(shí)習(xí)僧小弟,安排他實(shí)現(xiàn)對(duì)目標(biāo)網(wǎng)站 連通性檢測(cè)的小功能,簡(jiǎn)單講就是將下邊的shell 腳本換成Java 代碼來實(shí)現(xiàn)

#!/bin/bash
URL="https://www.baidu"
HTTP_CODE=`curl -o /dev/null -s -w "%{http_code}" "${URL}"`
#echo $HTTP_CODE
if [ $HTTP_CODE != '200' ];then
curl 'https://oapi.dingtalk.com/robot/send?access_token=xx' \
   -H 'Content-Type: application/json' \
   -d '{"msgtype": "text",
        "text": {
             "content": "百度平臺(tái)狀態(tài)不正常,請(qǐng)注意!"
        },
        "isAtAll": true
      }'

fi

功能實(shí)現(xiàn)

使用spring task
@Scheduled(cron = "0 0 0/1 * * ? ")
public void startSchedule() {
    log.info("開始執(zhí)行定時(shí)任務(wù) ,檢測(cè)百度網(wǎng)站連通性");
    try {
        HttpResponse response = HttpRequest.get("").execute();
        if (HttpStatus.HTTP_OK != response.getStatus()) {
            this.send2DingTalk(response.getStatus());
        }
        log.info("請(qǐng)求百度成功,返回報(bào)文:{}",response.body());
    } catch (HttpException e) {
        log.error("請(qǐng)求異常百度:{}", e);
        this.send2DingTalk(e.getMessage());
    }
    log.info("執(zhí)行檢測(cè)百度網(wǎng)站連通任務(wù)完畢");
}

問題描述

部署在服務(wù)器上,我的老jio本 都已經(jīng)呼叫任務(wù)狀態(tài)不正常了,可是小弟的Java 代碼還是沒有執(zhí)行通知

如何使用Arthas 獲取Spring ApplicationContext還原問題現(xiàn)場(chǎng)

  • 去翻生產(chǎn)日志,只輸入了開始并沒有輸出定時(shí)任務(wù)結(jié)束,感覺是哪里卡死,想當(dāng)然以為如果超時(shí)總會(huì)到catch 邏輯,排查無果

  • 由于任務(wù)是一小時(shí)一次,如何快速觸發(fā)一下這個(gè)異常,還原事故現(xiàn)場(chǎng)

  • 由于使用簡(jiǎn)單的Spring Task 沒有圖形化界面和API接口

Arthas 還原事故現(xiàn)場(chǎng),重新觸發(fā)任務(wù)

核心拿到 spring context 然后執(zhí)行它的 startSchedule 方法

確定監(jiān)控點(diǎn)
  • SpringMVC 的請(qǐng)求會(huì)通過 RequestMappingHandlerAdapter 執(zhí)行invokeHandlerMethod 到達(dá)目標(biāo)接口上進(jìn)行處理

  • 而在 RequestMappingHandlerAdapter類中有 getApplicationContext()

@Nullable
public final ApplicationContext getApplicationContext() throws IllegalStateException {
    if (this.applicationContext == null && this.isContextRequired()) {
        throw new IllegalStateException("ApplicationObjectSupport instance [" + this + "] does not run in an ApplicationContext");
    } else {
        return this.applicationContext;
    }
}
  • 任意執(zhí)行一次請(qǐng)求獲取到 RequestMappingHandlerAdapter target 目標(biāo),然后執(zhí)行 getApplicationContext

tt命令 獲取到ApplicationContext
  • arthas 執(zhí)行 tt

tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod
  • 任意執(zhí)行一次web 請(qǐng)求,tt 即可捕獲
    如何使用Arthas 獲取Spring ApplicationContext還原問題現(xiàn)場(chǎng)

  • 根據(jù)目標(biāo)的索引,執(zhí)行自定義 OGNL 表達(dá)式即可

tt -i 1019 -w 'target.getApplicationContext()'

如何使用Arthas 獲取Spring ApplicationContext還原問題現(xiàn)場(chǎng)

使用ApplicationContext獲取 定時(shí)任務(wù)bean 執(zhí)行 startSchedule
tt -i 1000 -w 'target.getApplicationContext().getBean("baiduSchedule").startSchedule()'

ok 任務(wù)重新觸發(fā)了

事故原因調(diào)查清楚,由于使用hutool 的工具類 沒有設(shè)置timeout 導(dǎo)致無限等待,所以沒有執(zhí)行catch 邏輯

到此,關(guān)于“如何使用Arthas 獲取Spring ApplicationContext還原問題現(xiàn)場(chǎng)”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI