摘要:背景最近來了個實習僧小弟,安排他實現對目標網站連通性檢測的小功能簡單講就是將下邊的腳本換成代碼來實現百度平臺狀態(tài)不正常,請注意功能實現使用開始執(zhí)行定時任務,檢測百度網站連通性請求百度成功,返回報文請求異常百度執(zhí)行檢測百度網站連通
背景
最近來了個實習僧小弟,安排他實現對目標網站 連通性檢測的小功能,簡單講就是將下邊的shell 腳本換成Java 代碼來實現
#!/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)不正常,請注意!" }, "isAtAll": true }" fi功能實現 使用spring task
@Scheduled(cron = "0 0 0/1 * * ? ") public void startSchedule() { log.info("開始執(zhí)行定時任務 ,檢測百度網站連通性"); try { HttpResponse response = HttpRequest.get("").execute(); if (HttpStatus.HTTP_OK != response.getStatus()) { this.send2DingTalk(response.getStatus()); } log.info("請求百度成功,返回報文:{}",response.body()); } catch (HttpException e) { log.error("請求異常百度:{}", e); this.send2DingTalk(e.getMessage()); } log.info("執(zhí)行檢測百度網站連通任務完畢"); }問題描述
部署在服務器上,我的老jio本 都已經呼叫任務狀態(tài)不正常了,可是小弟的Java 代碼還是沒有執(zhí)行通知
去翻生產日志,只輸入了開始并沒有輸出定時任務結束,感覺是哪里卡死,想當然以為如果超時總會到catch 邏輯,排查無果
由于任務是一小時一次,如何快速觸發(fā)一下這個異常,還原事故現場
由于使用簡單的Spring Task 沒有圖形化界面和API接口
Arthas 還原事故現場,重新觸發(fā)任務核心拿到 spring context 然后執(zhí)行它的 startSchedule 方法
確定監(jiān)控點SpringMVC 的請求會通過 RequestMappingHandlerAdapter 執(zhí)行invokeHandlerMethod 到達目標接口上進行處理
而在 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í)行一次請求獲取到 RequestMappingHandlerAdapter target 目標,然后執(zhí)行 getApplicationContext
tt命令 獲取到ApplicationContextarthas 執(zhí)行 tt
tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod
任意執(zhí)行一次web 請求,tt 即可捕獲
根據目標的索引,執(zhí)行自定義 OGNL 表達式即可
tt -i 1019 -w "target.getApplicationContext()"使用ApplicationContext獲取 定時任務bean 執(zhí)行 startSchedule
tt -i 1000 -w "target.getApplicationContext().getBean("baiduSchedule").startSchedule()"
ok 任務重新觸發(fā)了
事故原因調查清楚,由于使用hutool 的工具類 沒有設置timeout 導致無限等待,所以沒有執(zhí)行catch 邏輯
總結以上嚇哭實習僧的操作禁止生產操作,只是提供個思路 ,當然可以衍生其他業(yè)務場景的操作
核心是通過Arthas 來抓取Spring ApplicationContext 對象,然后獲取bean 進行執(zhí)行方法
關于Arthas 是Alibaba開源的Java診斷工具,深受開發(fā)者喜愛
歡迎關注我們獲得更多的好玩JavaEE 實踐 :
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://www.ezyhdfw.cn/yun/75738.html
摘要:背景最近來了個實習僧小弟,安排他實現對目標網站連通性檢測的小功能簡單講就是將下邊的腳本換成代碼來實現百度平臺狀態(tài)不正常,請注意功能實現使用開始執(zhí)行定時任務,檢測百度網站連通性請求百度成功,返回報文請求異常百度執(zhí)行檢測百度網站連通 背景 最近來了個實習僧小弟,安排他實現對目標網站 連通性檢測的小功能,簡單講就是將下邊的shell 腳本換成Java 代碼來實現 1#!/bin/bash ...
摘要:對于人類來說,字節(jié)碼文件的可讀性遠遠沒有代碼高。盡管如此,還是有一些杰出的程序員們創(chuàng)造出了可以用來直接編輯字節(jié)碼的框架,提供接口可以讓我們方便地操作字節(jié)碼文件,進行注入修改類的方法,動態(tài)創(chuàng)造一個新的類等等操作。 引子 在遙遠的希艾斯星球爪哇國塞沃城中,兩名年輕的程序員正在為一件事情苦惱,程序出問題了,一時看不出問題出在哪里,于是有了以下對話: Debug一下吧。 線上機器,沒開Debu...
摘要:診斷工具簡介是阿里開源的一個線上診斷工具,發(fā)現阿里還是挺喜歡開源一些技術的,造福人類。昨天試用了一下,發(fā)現真是強大,解決了我工作兩年的很多困擾,有點相見恨晚的感覺。每秒統(tǒng)計方法的調用次數,成功失敗次數和平均響應時間等。具體使用請見。 Java診斷工具Arthas 1. Arthas簡介 Arthas是阿里開源的一個線上java診斷工具,發(fā)現阿里還是挺喜歡開源一些技術的,造福人類。昨天試...
摘要:是什么摘自的介紹大意為是阿里開源的一個診斷工具,可以幫助開發(fā)人員在不修改代碼或重啟服務器的情況下快速定位線上問題。聽起來確實是我們的程序員的一大福利。參考資料使用手冊 1. Arthas是什么? 摘自Arthas的Github介紹: Arthas is a Java Diagnostic tool open sourced by Alibaba. Arthas allows deve...
摘要:是什么鬼是一款阿里巴巴開源的線上診斷工具,功能非常強大,可以解決很多線上不方便解決的問題。診斷使用的是命令行交互模式,支持,操作系統(tǒng),命令還支持使用鍵對各種信息的自動補全,診斷起來非常利索。顯示當前系統(tǒng)的實時數據面板,按即可退出。 Arthas是什么鬼? Arthas是一款阿里巴巴開源的 Java 線上診斷工具,功能非常強大,可以解決很多線上不方便解決的問題。 Arthas診斷使用的是...
閱讀 2342·2021-11-11 16:55
閱讀 3334·2021-10-11 10:58
閱讀 3295·2021-09-13 10:28
閱讀 4242·2021-07-26 23:57
閱讀 1220·2019-08-30 15:56
閱讀 1482·2019-08-29 13:15
閱讀 1411·2019-08-26 18:18
閱讀 1444·2019-08-26 13:44