Arthas 手动触发生产定时任务的危险操作

简介: 背景最近来了个实习僧小弟,安排他实现对目标网站 连通性检测的小功能,简单讲就是将下边的shell 脚本换成Java 代码来实现#!/bin/bashURL="https://www.baidu"HTTP_CODE=`curl -o /dev/null -s -w "%{http_code}...

背景

最近来了个实习僧小弟,安排他实现对目标网站 连通性检测的小功能,简单讲就是将下边的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": "百度平台状态不正常,请注意!"
        },
        "isAtAll": true
      }'

fi

功能实现

使用spring task

@Scheduled(cron = "0 0 0/1 * * ? ")
public void startSchedule() {
    log.info("开始执行定时任务 ,检测百度网站连通性");
    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("执行检测百度网站连通任务完毕");
}

问题描述

部署在服务器上,我的老jio本 都已经呼叫任务状态不正常了,可是小弟的Java 代码还是没有执行通知

  • 去翻生产日志,只输入了开始并没有输出定时任务结束,感觉是哪里卡死,想当然以为如果超时总会到catch 逻辑,排查无果
  • 由于任务是一小时一次,如何快速触发一下这个异常,还原事故现场
  • 由于使用简单的Spring Task 没有图形化界面和API接口

Arthas 还原事故现场,重新触发任务

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

确定监控点

  • SpringMVC 的请求会通过 RequestMappingHandlerAdapter 执行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;
    }
}
  • 任意执行一次请求获取到 RequestMappingHandlerAdapter target 目标,然后执行 getApplicationContext

tt命令 获取到ApplicationContext

  • arthas 执行 tt
tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod
  • 任意执行一次web 请求,tt 即可捕获
  • 根据目标的索引,执行自定义 OGNL 表达式即可
tt -i 1019 -w 'target.getApplicationContext()'

使用ApplicationContext获取 定时任务bean 执行 startSchedule

tt -i 1000 -w 'target.getApplicationContext().getBean("baiduSchedule").startSchedule()'

ok 任务重新触发了

事故原因调查清楚,由于使用hutool 的工具类 没有设置timeout 导致无限等待,所以没有执行catch 逻辑

总结

  • 以上吓哭实习僧的操作禁止生产操作,只是提供个思路 ,当然可以衍生其他业务场景的操作
  • 核心是通过Arthas 来抓取Spring ApplicationContext 对象,然后获取bean 进行执行方法
  • 关于Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱
  • 欢迎关注我们获得更多的好玩JavaEE 实践
目录
相关文章
|
2月前
|
弹性计算 安全 机器人
一键搞定定时自动化通知
您是否经常忘了需要每周要填报工作时长?您的团队是否需要每月定时盘点HC?您是否每月末都在工作群提醒大家更新OKR? 这些简单的定时任务是不是经常会忘记或者占用您的精力?如果你也有这些烦恼,是时候来试试这个应用与数据集成平台——阿里云计算巢AppFlow了,它能够像一个神经中枢,高效地串联起所有关键数据流,并且能够巧妙地运用现代化的通讯工具如钉钉群机器人,实现定时消息通知,让每一个重要信息都能准时送达,不再因为简单重复的定时工作而占用您的时间和精力~
157 0
|
2天前
|
异构计算
zTasker v1.88.1一键定时自动化任务
zTasker是一款完全免费支持定时、热键或条件触发的方式执行多种自动化任务的小工具,支持win7-11。其支持超过100种任务类型,50+种定时/条件执行方法,而且任务列表可以随意编辑、排列、移动、更改类型,支持任务执行日志,可覆盖win自带的热键,同时支持任务列表等数据的备份及自动更新等。
18 3
|
3月前
|
传感器 自然语言处理 自动驾驶
自动执行与反馈
自动执行与反馈
18 1
|
4月前
|
运维 安全 搜索推荐
记一次crontab定时任务被清空的故障原因定位及复盘过程
记一次crontab定时任务被清空的故障原因定位及复盘过程
88 0
|
7月前
|
Java 编译器
即时编译的触发
即时编译的触发
|
测试技术
自动定时发送每日构建测试报告
自动定时发送每日构建测试报告
130 1
|
资源调度 运维 Java
定时任务报警通知解决方案详解
随着微服务和云计算的兴起,定时任务技术也是发展迅速,不仅能做单机的定时任务,而且在分布式系统下应用也很广泛,成为了业务做兜底、数据处理的第一选择。
2421 3
定时任务报警通知解决方案详解
「WGCLOUD」指令下发后需要多长时间执行完成
「WGCLOUD」的指令下发后需要多长时间执行完成
「WGCLOUD」指令下发后需要多长时间执行完成
|
Linux
12.21 Linux检测长期未执行的定时任务(anacron命令)
anacron 是用来做什么的呢?设想这样一个场景,Linux 服务器会在周末关机两天,但是设定的定时任务大多在周日早上进行,但在这个时间点,服务器又处于关机状态,导致系统很多定时任务无法运行。
419 0
12.21 Linux检测长期未执行的定时任务(anacron命令)