日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

使用Arthas 获取Spring ApplicationContext还原问题现场

發布時間:2025/5/22 javascript 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Arthas 获取Spring ApplicationContext还原问题现场 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

背景

最近來了個實習僧小弟,安排他實現對目標網站 連通性檢測的小功能,簡單講就是將下邊的shell 腳本換成Java 代碼來實現

1#!/bin/bash2URL="https://www.baidu"3HTTP_CODE=`curl -o /dev/null -s -w "%{http_code}" "${URL}"`4#echo $HTTP_CODE5if [ $HTTP_CODE != '200' ];then6curl 'https://oapi.dingtalk.com/robot/send?access_token=xx' \7 -H 'Content-Type: application/json' \8 -d '{"msgtype": "text",9 "text": { 10 "content": "百度平臺狀態不正常,請注意!" 11 }, 12 "isAtAll": true 13 }' 14 15fi復制代碼

功能實現

使用spring task

1@Scheduled(cron = "0 0 0/1 * * ? ")2public void startSchedule() {3 log.info("開始執行定時任務 ,檢測百度網站連通性");4 try {5 HttpResponse response = HttpRequest.get("").execute();6 if (HttpStatus.HTTP_OK != response.getStatus()) {7 this.send2DingTalk(response.getStatus());8 }9 log.info("請求百度成功,返回報文:{}",response.body()); 10 } catch (HttpException e) { 11 log.error("請求異常百度:{}", e); 12 this.send2DingTalk(e.getMessage()); 13 } 14 log.info("執行檢測百度網站連通任務完畢"); 15}復制代碼

問題描述

部署在服務器上,我的老jio本 都已經呼叫任務狀態不正常了,可是小弟的Java 代碼還是沒有執行通知

  • 去翻生產日志,只輸入了開始并沒有輸出定時任務結束,感覺是哪里卡死,想當然以為如果超時總會到catch 邏輯,排查無果
  • 由于任務是一小時一次,如何快速觸發一下這個異常,還原事故現場
  • 由于使用簡單的Spring Task 沒有圖形化界面和API接口

Arthas 還原事故現場,重新觸發任務

核心拿到 spring context 然后執行它的 startSchedule 方法

確定監控點

  • SpringMVC 的請求會通過 RequestMappingHandlerAdapter 執行invokeHandlerMethod 到達目標接口上進行處理
  • 而在 RequestMappingHandlerAdapter類中有 getApplicationContext()
1@Nullable 2public final ApplicationContext getApplicationContext() throws IllegalStateException { 3 if (this.applicationContext == null && this.isContextRequired()) { 4 throw new IllegalStateException("ApplicationObjectSupport instance [" + this + "] does not run in an ApplicationContext"); 5 } else { 6 return this.applicationContext; 7 } 8}復制代碼

  • 任意執行一次請求獲取到 RequestMappingHandlerAdaptertarget 目標,然后執行 getApplicationContext

tt命令 獲取到ApplicationContext

  • arthas 執行 tt
1tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod復制代碼

  • 任意執行一次web 請求,tt 即可捕獲

  • 根據目標的索引,執行自定義 OGNL 表達式即可
1tt -i 1019 -w 'target.getApplicationContext()'復制代碼

使用ApplicationContext獲取 定時任務bean 執行 startSchedule

1tt -i 1000 -w 'target.getApplicationContext().getBean("baiduSchedule").startSchedule()'復制代碼

ok 任務重新觸發了

事故原因調查清楚,由于使用hutool 的工具類 沒有設置timeout 導致無限等待,所以沒有執行catch 邏輯

總結

以上嚇哭實習僧的操作禁止生產操作,只是提供個思路 ,當然可以衍生其他業務場景的操作

核心是通過Arthas 來抓取Spring ApplicationContext 對象,然后獲取bean 進行執行方法

關于Arthas 是Alibaba開源的Java診斷工具,深受開發者喜愛

歡迎關注我們獲得更多的好玩JavaEE 實踐

推薦閱讀:

《深入理解 Java 內存模型》讀書筆記

面試-基礎篇

Spring Boot 2.0 遷移指南

SpringBoot使用Docker快速部署項目

為什么選擇 Spring 作為 Java 框架?

SpringBoot RocketMQ 整合使用和監控

Spring Boot 面試的十個問題

使用 Spring Framework 時常犯的十大錯誤

SpringBoot Kafka 整合使用

SpringBoot RabbitMQ 整合使用

上篇好文:

如何優雅關閉 Spring Boot 應用

轉載于:https://juejin.im/post/5d498a1af265da03e921b262

總結

以上是生活随笔為你收集整理的使用Arthas 获取Spring ApplicationContext还原问题现场的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。