javascript
使用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()
- 任意執行一次請求獲取到 RequestMappingHandlerAdaptertarget 目標,然后執行 getApplicationContext
tt命令 獲取到ApplicationContext
- arthas 執行 tt
- 任意執行一次web 請求,tt 即可捕獲
- 根據目標的索引,執行自定義 OGNL 表達式即可
使用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还原问题现场的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: elastic-job详解(一):数据分
- 下一篇: python_0基础开始_day05