场景1 记录请求时间和次数
生产环境一定要加 -n 参数,不然会打满jvm
[arthas@8868]$ tt -t org.fyh.arthas.controller.ProgressController test -n 5
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 99 ms, listenerId: 1
INDEX TIMESTAMP COST(ms) IS-RET IS-EXP OBJECT CLASS METHOD
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1000 2022-09-20 16:21:06 617.5923 true false 0x2fdd5af4 ProgressController test
1001 2022-09-20 16:21:10 417.3191 true false 0x2fdd5af4 ProgressController test
tt 命令记录2次请求,IS-RET=是否return, IS-EXP=是否exception,
场景2 模拟内部发起请求
利用时空隧道重复执行,-i是上面的index, 相当是请求的镜像,包含了入参数,这个时候可以使用应用打印日志来判断是否重复执行成功
模拟index为1000的调用
[arthas@8868]$ tt -i 1000 -p
RE-INDEX 1000
GMT-REPLAY 2022-09-20 16:21:42
OBJECT 0x2fdd5af4
CLASS org.fyh.arthas.controller.ProgressController
METHOD test
PARAMETERS[0] @Integer[2]
IS-RETURN true
IS-EXCEPTION false
COST(ms) 613.1518
RETURN-OBJ @ApiResult[
code=@Integer[200],
msg=@String[OK],
data=null,
]
Time fragment[1000] successfully replayed 1 times.
模拟index为1001的调用
[arthas@8868]$ tt -i 1001 -p
RE-INDEX 1001
GMT-REPLAY 2022-09-20 16:21:57
OBJECT 0x2fdd5af4
CLASS org.fyh.arthas.controller.ProgressController
METHOD test
PARAMETERS[0] @Integer[3]
IS-RETURN true
IS-EXCEPTION false
COST(ms) 401.6286
RETURN-OBJ @ApiResult[
code=@Integer[200],
msg=@String[OK],
data=null,
]
场景3 获取到Spring Context,然后为所欲为,任意执行对象和方法
执行tt命令来记录RequestMappingHandlerAdapter#invokeHandlerMethod的请求
1. tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod
2. tt -i 1000 -w 'target.getApplicationContext()'
3. tt -i 1002 -w 'target.getApplicationContext().getBean("xxxServiceImpl").xxx()' 触发指定方法执行
备注1:因为我们是SpringMVC应用,所有请求都会被RequestMappingHandlerAdapter拦截
备注2:Arthas会把当前执行的对象放到target变量中;所以是‘target.getApplicationContext()’
备注3:一定要使用 #1 先监听这个类的方法调用,才可以获取#2 获取context