背景

最近来了个实习僧小弟,安排他实现对目标网站 连通性检测的小功能,简单讲就是将下边的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还原问题现场相关推荐

  1. spring获取webapplicationcontext,applicationcontext几种方法详解(转载)

    转载自  http://www.blogjava.net/Todd/archive/2010/04/22/295112.html 方法一:在初始化时保存ApplicationContext对象 代码: ...

  2. 使用 spring 的 IOC 解决程序耦合——获取spring的Ioc核心容器,并根据id获取对象、核心容器的两个接口(ApplicationContext、BeanFactory)引发出的问题

    IOC概念和spring中的IOC 明确 ioc 的作用: 削减计算机程序的耦合(解除我们代码中的依赖关系). 使用 spring 的 IOC 解决程序耦合 获取spring的Ioc核心容器,并根据i ...

  3. 获取Spring的ApplicationContext的几种方式

    转载自 获取Spring的ApplicationContext的几种方式 Application Context定义 简单来说就是Spring中的高级容器,可以获取容器中的各种bean组件,注册监听事 ...

  4. spring获取webapplicationcontext,applicationcontext几

    2019独角兽企业重金招聘Python工程师标准>>> 方法一:在初始化时保存ApplicationContext对象 代码: ApplicationContext ac = new ...

  5. springboot实战 获取spring上下文的4种方式

    实际开发中我们经常需要通过spring上下文获取一些配置信息,本文阐述springboot应用获取spring上下文的几种方式. 方式一:实现ApplicationContextAware接口 imp ...

  6. 怎么随时获取Spring的上下文ApplicaitonContext,和Spring管理的Bean

    BeanFactory接口 Interface BeanFactory getBean <T> T getBean(String name,Class<T> requiredT ...

  7. 【SpringBoot】在普通类中获取spring容器中的bean

    这段时间公司搞封闭开发,做一个联通总部的客服系统项目,是基于springboot的.在开发工程中遇到一个页面datagrid数据排序的功能,因为有多个表的数据都要用到排序功能,于是我就写了一个排序功能 ...

  8. java 获取spring对象数组_解析Java中如何获取Spring中配置的bean

    解析Java中如何获取Spring中配置的bean Java中如何获取Spring中配置的bean?下面是由百分网小编为大家整理的解析Java中如何获取Spring中配置的bean,喜欢的可以收藏一下 ...

  9. 工具类:获取 spring 容器中 bean

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. package com.orange.utils;import org.springframewor ...

最新文章

  1. 编写c语言程序 斐波那契,C语言程序实现斐波那契数列的解题思路???
  2. 揭秘仿人机器人背后的技术秘密 | 优必选研究院技术专家刘益彰【附PPT】
  3. Razor Engine,动态脚本语言,mvc上的语法,适用于文件内容生成,静态网页生成等。...
  4. 藁城一中2021年高考成绩查询,2017藁城一中录取分数线及高考成绩情况
  5. springboot actuator监控笔记
  6. Linux系统中源码包tomcat的管理
  7. 区块链的爆发仍为时尚早......
  8. c语言中数据类型的课件,C语言数据类型课件.ppt
  9. jQuery,Table表头固定插件chromatable存在的问题及解决办法
  10. WPF: WrapPanel 容器的数据绑定(动态生成控件、遍历)
  11. 双态运维联盟首个“共研基地”落户云南电网信息中心
  12. 强大的Windows 10数字权利获取工具HWIDGEN
  13. android正反面切换,普通安卓手机数据线可以正反插吗?你一定猜错了
  14. SpringBoot 统一功能处理
  15. 前端涨薪必读,node.js入门保姆级教程
  16. html5播放加速,html5倍速播放插件
  17. 打印时的纸张大小尺寸
  18. 二,区块链理论(定义及特性)
  19. PowerPC MMU机制读书笔记
  20. 长江钢琴质量具有哪些优势

热门文章

  1. php处理json请求(php获取post请求的json数据的实现方法)
  2. 修改Android下的radioButton字体的颜色
  3. 32位地址的寻址方式
  4. 差分约束系统【模板】
  5. 用MapReduce实现矩阵乘法
  6. gin自定义日志格式
  7. 大型网站架构模式之二
  8. muduo之EventLoopThreadPool
  9. 苹果Mac操作系统下怎么显示隐藏文件
  10. 面向对象编程基础 (一)