利用Thymeleaf在浏览器查看线程堆栈
1、目录结构:
2、application.properties
spring.thymeleaf.cache=false
spring.thymeleaf.prefix=classpath:/view/
3、pom
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><!--页面模板依赖-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency><!--热部署依赖-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
4、html
<!DOCTYPE HTML>
<HTML xmlns:th="http://www.thymeleaf.org">
<head>
<title>服务器线程信息</title>
<h1>获取虚拟机中所有线程的StackTraceElement对象,查看线程堆栈</h1>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<div th:each="t:${value}">
【线程:<span th:text="${t.key}"/>】<br>
<span th:text="${t.value}"/><br><br>
</div>
</body>
</HTML>
5、controller
可以把逻辑封装到service层
@Controller
public class StackController {
@PassToken
@RequestMapping(value = "/jstack",method = RequestMethod.GET)
public String jstack(Model model) {
Map<String,List<StackTraceElement>> mapEle = new HashMap<>();
for (Map.Entry<Thread, StackTraceElement[]> stackTrace : Thread.getAllStackTraces().entrySet()) {
Thread thread = stackTrace.getKey();
StackTraceElement[] stack = stackTrace.getValue();
if(thread.equals(Thread.currentThread())) {
continue;
}
List<StackTraceElement> ele = new ArrayList<>();
for (StackTraceElement element : stack) {
ele.add(element);
}
mapEle.put(thread.getName(),ele);
}
model.addAttribute("value",mapEle);
return "jstack";
}
}
6、效果