1、Arthas 利用 spring applicationContext获取任何Bean
RequestMappingHandlerAdapter
父接口ApplicationObjectSupport
存在获取spring上下文方法getApplicationContext()
- 执行任何一次请求, tt -t记录RequestMappingHandlerAdapter请求
排查问题时经常需要测试同学的配合重新发起请求,arthas为减少这种麻烦,提供了tt命令支持重放请求
tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod
- 执行tt命令获取Spring Application Context
执行tt命令的-i参数来指定index,并且用-w参数来执行ognl表达式来获取spring context
tt -i 1000 -w 'target.getApplicationContext()
- 从Spring context中获取任何Bean对象
tt -i 1000 -w 'target.getApplicationContext().getBean("authConfigServiceImpl").listByLocationCode("510000")'
应用场景:
- 生产环境的任务是定时触发的,发生了异常,比如1天触发一次,又没有界面重新实时触发任务,这时就可以通过arthas Spring context获取业务的Bean对象重新触发一次任务方法。
2、Arthas 利用 trace记录方法的调用链路,并输出方法路径上的每个节点上耗时
trace 能方便的帮助你定位和发现因 RT 高而导致的性能问题缺陷,trace 在执行的过程中本身是会有一定的性能开销,在统计的报告中并未像 JProfiler 一样预先减去其自身的统计开销
trace com.alibaba.dubbo.rpc.Filter * '#cost > 1000' -n 1
-n 参数指定捕捉结果的次数
'#cost>100'表示当执行时间超过100ms的时候,才会输出trace的结果
3、Arthas 排查404问题
Java web中Servlet、Filter、Listener的优先级listener>filter>servlet
。
Listener是用于监听事件,Filter就是用来拦截进行一些日志类似aop的功能,而Servlet就是转发到别的页面。
trace javax.servlet.Filter * -n 1
- 通过trace Servlet/Filter,可以快速定位Java Web问题
- trace是了解应用执行流程的利器,只要trace到关键的接口或者类上
- 仔细观察trace的结果,可以学习到Spring MVC是处理Web请求细节
4、如何在内部类对象中访问外部类对象的成员变量
class ServerImpl implements TimeSource {
private Set<HttpConnection> allConnections;
class ServerTimerTask extends TimerTask {
ServerTimerTask() {
}
public void run() {
// do something
}
}
}
想在内部类的run方法里面,访问allConnections这个变量的大小,应该如何写ognl表达式?
watch sun.net.httpserver.ServerImpl$ServerTimerTask1 run -f "target.this$0.allConnections.size()