idea在线安装arthas插件
安装完之后重启,进入设置,添加spring static content ognl setting配置,这个配置主要是获取spring应用的上下文对象,在spring工程中添加一下代码就可以了:
package com.mysteel.oem.database.util;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@Component
@Order
public class ApplicationContextHolder implements ApplicationContextAware {
/**
* Spring应用上下文环境
*/
private static ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
ApplicationContextHolder.context = applicationContext;
}
}
右键你想监控的方法
点击复制命令,放在arthas客户端去执行,用idea的目的就是生成执行命令较为方便
下面我们根据一个spring bean来测试
package com.mysteel.oem.database.service.impl;
import lombok.Data;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Component
public class TestImpl {
private int param1 = 0;
private static int param2 = 1;
public List<Response> test(Param param){
return test1(param);
}
public List<Response> test1(Param param){
return test2(param);
}
public List<Response> test2(Param param){
List<Response> userList = new ArrayList<>();
if(param.getName().startsWith("y")){
Response response = new Response();
HashMap map = new HashMap();
response.setName("yy");
response.setAge(0);
response.setInner(param.inner);
map.put(response.name,response.age);
response.setMap(map);
userList.add(response);
}else if(param.getName().startsWith("z")){
Response response = new Response();
HashMap map = new HashMap();
response.setName("zz");
response.setAge(1);
response.setInner(param.inner);
map.put(response.name,response.age);
response.setMap(map);
userList.add(response);
}else {
Response response1 = new Response();
HashMap map1 = new HashMap();
response1.setName("aa");
response1.setAge(2);
response1.setInner(param.inner);
map1.put(response1.name,response1.age);
response1.setMap(map1);
userList.add(response1);
Response response2 = new Response();
HashMap map2 = new HashMap();
response2.setName("bb");
response2.setAge(3);
response2.setInner(param.inner);
map2.put(response1.name,response1.age);
response1.setMap(map2);
userList.add(response2);
}
return userList;
}
@Data
public static class Inner{
private String school;
public Inner(String school) {
this.school = school;
}
}
@Data
public static class Response{
private String name;
private Integer age;
private Inner inner;
private Map<String,Integer> map;
}
@Data
public static class Param{
private String name;
private Integer age;
private Inner inner;
public Param(String name, Integer age, Inner inner) {
this.name = name;
this.age = age;
this.inner = inner;
}
}
}
获取spring bean对象中的普通属性
[arthas@17476]$ ognl -x 3 '#springContext=@com.mysteel.oem.database.util.ApplicationContextHolder@context,#springContext.getBean("testImpl").param1'
@Integer[0]
获取静态属性
[arthas@17476]$ ognl -x 3 '@com.mysteel.oem.database.service.impl.TestImpl@param2'
@Integer[1]
执行方法-对象传参,返回list
[arthas@22068]$ ognl -x 3 '#inner=new com.mysteel.oem.database.service.impl.TestImpl$Inner("abc"),#springContext=@com.mysteel.oem.database.util.ApplicationContextHolder@context,#springContext.getBean("testImpl").test2(new com.mysteel.oem.database.service.impl.TestI
mpl$Param("asdsa",1,#inner))'
@ArrayList[
@Response[
name=@String[aa],
age=@Integer[2],
inner=@Inner[
school=@String[abc],
],
map=@HashMap[
@String[aa]:@Integer[2],
],
],
@Response[
name=@String[bb],
age=@Integer[3],
inner=@Inner[
school=@String[abc],
],
map=null,
],
]
对返回的结果取值-根据索引取list中的元素
[arthas@22068]$ ognl -x 3 '#inner=new com.mysteel.oem.database.service.impl.TestImpl$Inner("abc"),#springContext=@com.mysteel.oem.database.util.ApplicationContextHolder@context,#springContext.getBean("testImpl").test2(new com.mysteel.oem.database.service.impl.TestI
mpl$Param("asdsa",1,#inner))[0]'
@Response[
name=@String[aa],
age=@Integer[2],
inner=@Inner[
school=@String[abc],
],
map=@HashMap[
@String[aa]:@Integer[2],
],
]
对返回的结果取值-取对象中的属性
[arthas@22068]$ ognl -x 3 '#inner=new com.mysteel.oem.database.service.impl.TestImpl$Inner("abc"),#springContext=@com.mysteel.oem.database.util.ApplicationContextHolder@context,#springContext.getBean("testImpl").test2(new com.mysteel.oem.database.service.impl.TestI
mpl$Param("asdsa",1,#inner))[0].name'
@String[aa]
对返回的结果取值-map中根据key取value
[arthas@22068]$ ognl -x 3 '#inner=new com.mysteel.oem.database.service.impl.TestImpl$Inner("abc"),#springContext=@com.mysteel.oem.database.util.ApplicationContextHolder@context,#springContext.getBean("testImpl").test2(new com.mysteel.oem.database.service.impl.TestI
mpl$Param("asdsa",1,#inner))[0].map["aa"]'
@Integer[2]