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

背景

最近來了個(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í)行通知

  • 去翻生產(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 即可捕獲

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

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

使用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 邏輯

總結(jié)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市墨叛,隨后出現(xiàn)的幾起案子止毕,更是在濱河造成了極大的恐慌,老刑警劉巖漠趁,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滓技,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡棚潦,警方通過查閱死者的電腦和手機(jī)令漂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丸边,“玉大人叠必,你說我怎么就攤上這事∶媒眩” “怎么了纬朝?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)骄呼。 經(jīng)常有香客問我共苛,道長(zhǎng),這世上最難降的妖魔是什么蜓萄? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任隅茎,我火速辦了婚禮,結(jié)果婚禮上嫉沽,老公的妹妹穿的比我還像新娘辟犀。我一直安慰自己,他們只是感情好绸硕,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布堂竟。 她就那樣靜靜地躺著魂毁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪出嘹。 梳的紋絲不亂的頭發(fā)上席楚,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音税稼,去河邊找鬼烦秩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛娶聘,可吹牛的內(nèi)容都是我干的闻镶。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼丸升,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼铆农!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起狡耻,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤墩剖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后夷狰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體岭皂,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年沼头,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了爷绘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡进倍,死狀恐怖土至,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情猾昆,我是刑警寧澤陶因,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站垂蜗,受9級(jí)特大地震影響楷扬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜贴见,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一烘苹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蝇刀,春花似錦螟加、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至站粟,卻和暖如春黍图,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背奴烙。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工助被, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人切诀。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓揩环,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親幅虑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子丰滑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 作者簡(jiǎn)介陳喆,現(xiàn)就職于中科院某研究所擔(dān)任副研究員倒庵,專注于工業(yè)云平臺(tái)褒墨、MES系統(tǒng)的設(shè)計(jì)與研發(fā)。 spring-mus...
    Gavin陳閱讀 837評(píng)論 0 1
  • Spring 概述 1. 什么是spring?Spring 是個(gè)java企業(yè)級(jí)應(yīng)用的開源開發(fā)框架擎宝。Spring主要...
    vaneL閱讀 369評(píng)論 0 4
  • Spring容器高層視圖 Spring 啟動(dòng)時(shí)讀取應(yīng)用程序提供的Bean配置信息郁妈,并在Spring容器中生成一份相...
    Theriseof閱讀 2,796評(píng)論 1 24
  • 1.什么是spring? Spring是個(gè)java企業(yè)級(jí)應(yīng)用的開源開發(fā)框架。Spring主要用來開發(fā)Java應(yīng)用绍申,...
    青玉_f18c閱讀 327評(píng)論 0 2
  • 你是漫川的煙波噩咪,又是湖底的星河 你是年復(fù)一年的春光,又是從不缺席的秋陽 湖邊小孩的嬉鬧 打漂的石塊极阅,在湖面蕩起的波...
    就要想當(dāng)然閱讀 199評(píng)論 2 3