From a59615e5f191412f38ec00c8708e64c489d3e8e9 Mon Sep 17 00:00:00 2001
From: huoyo <1729913829@qq.com>
Date: Sat, 1 Oct 2022 20:02:31 +0800
Subject: [PATCH] optimize jvmattach
---
pom.xml | 2 +-
.../kotime/controller/KoTimeController.java | 17 +++------
.../langpy/kotime/service/ClassService.java | 31 ++++++++++++++++
.../JvmAttachClassService.java} | 36 ++++++++++++-------
4 files changed, 59 insertions(+), 27 deletions(-)
create mode 100644 src/main/java/cn/langpy/kotime/service/ClassService.java
rename src/main/java/cn/langpy/kotime/{util/ClassUtil.java => service/JvmAttachClassService.java} (71%)
diff --git a/pom.xml b/pom.xml
index 0ba4272..3bfd03b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
cn.langpy
ko-time
- 2.2.8
+ 2.2.9
KoTime
A springboot tool for tracking the paths of the methods,which can help you to find methods's performances easily.
diff --git a/src/main/java/cn/langpy/kotime/controller/KoTimeController.java b/src/main/java/cn/langpy/kotime/controller/KoTimeController.java
index a4ca199..4cedb96 100644
--- a/src/main/java/cn/langpy/kotime/controller/KoTimeController.java
+++ b/src/main/java/cn/langpy/kotime/controller/KoTimeController.java
@@ -4,8 +4,8 @@ import cn.langpy.kotime.annotation.Auth;
import cn.langpy.kotime.config.DefaultConfig;
import cn.langpy.kotime.constant.KoConstant;
import cn.langpy.kotime.model.*;
+import cn.langpy.kotime.service.ClassService;
import cn.langpy.kotime.service.GraphService;
-import cn.langpy.kotime.util.ClassUtil;
import cn.langpy.kotime.util.Context;
import cn.langpy.kotime.util.InvalidAuthInfoException;
import cn.langpy.kotime.util.KoUtil;
@@ -36,9 +36,6 @@ public class KoTimeController {
@Value("${ko-time.password:}")
private String password;
- @Value("${ko-time.agent-path:}")
- private String agentPath;
-
private static Logger log = Logger.getLogger(KoTimeController.class.toString());
private final String uiKitCssText = getResourceText("kostatic/uikit.min.css");
private final String uiKitJsText = getResourceText("kostatic/uikit.min.js");
@@ -281,16 +278,10 @@ public class KoTimeController {
map.put("message", "无法解析文件");
return map;
}
- File jar = null;
- if (!StringUtils.hasText(agentPath)) {
- jar = ClassUtil.createJar();
- agentPath = jar.getAbsolutePath();
- }
- ClassUtil.updateClass(agentPath,className,file.getAbsolutePath());
+ final ClassService classService = ClassService.getInstance();
+ classService.updateClass(className,file.getAbsolutePath());
file.deleteOnExit();
- if (jar!=null) {
- jar.deleteOnExit();
- }
+
map.put("state", 1);
map.put("message", "更新成功");
return map;
diff --git a/src/main/java/cn/langpy/kotime/service/ClassService.java b/src/main/java/cn/langpy/kotime/service/ClassService.java
new file mode 100644
index 0000000..77ef04b
--- /dev/null
+++ b/src/main/java/cn/langpy/kotime/service/ClassService.java
@@ -0,0 +1,31 @@
+package cn.langpy.kotime.service;
+
+
+
+import java.util.logging.Logger;
+
+public interface ClassService {
+ void updateClass(String className, String classPath);
+
+ static ClassService getInstance() {
+ return ClassServiceFactory.getInstance();
+ }
+}
+
+class ClassServiceFactory {
+ private static Logger log = Logger.getLogger(ClassServiceFactory.class.toString());
+
+ private static ClassService instance = null;
+
+ public static ClassService getInstance() {
+ if (instance == null) {
+ synchronized (ClassService.class) {
+ if (instance == null) {
+ instance = new JvmAttachClassService();
+ }
+ }
+ }
+ return instance;
+ }
+}
+
diff --git a/src/main/java/cn/langpy/kotime/util/ClassUtil.java b/src/main/java/cn/langpy/kotime/service/JvmAttachClassService.java
similarity index 71%
rename from src/main/java/cn/langpy/kotime/util/ClassUtil.java
rename to src/main/java/cn/langpy/kotime/service/JvmAttachClassService.java
index d8af7a2..23aa938 100644
--- a/src/main/java/cn/langpy/kotime/util/ClassUtil.java
+++ b/src/main/java/cn/langpy/kotime/service/JvmAttachClassService.java
@@ -1,24 +1,34 @@
-package cn.langpy.kotime.util;
+package cn.langpy.kotime.service;
+import cn.langpy.kotime.util.Context;
import net.bytebuddy.agent.VirtualMachine;
import org.springframework.core.io.ClassPathResource;
-import java.io.*;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
import java.util.logging.Logger;
-/**
- * zhangchang
- */
-public class ClassUtil {
+public class JvmAttachClassService implements ClassService{
+ private static Logger log = Logger.getLogger(JvmAttachClassService.class.toString());
- private static Logger log = Logger.getLogger(ClassUtil.class.toString());
+ private File agentJar;
- public static void updateClass(String jarPath, String className, String classPath) {
+ public JvmAttachClassService() {
+ this.agentJar = createAgentJar();
+ }
+
+ @Override
+ public void updateClass(String className, String classPath) {
try {
+ if (agentJar==null || !agentJar.exists()) {
+ agentJar = createAgentJar();
+ }
VirtualMachine virtualMachine = VirtualMachine.ForHotSpot.attach(Context.getPid());
- virtualMachine.loadAgent(jarPath, className + "-" + classPath);
+ virtualMachine.loadAgent(agentJar.getAbsolutePath(), className + "-" + classPath);
Thread.sleep(500);
virtualMachine.detach();
} catch (IOException e) {
@@ -29,7 +39,7 @@ public class ClassUtil {
}
}
- public static File createJar() {
+ public File createAgentJar() {
File jarFile = null;
try {
jarFile = File.createTempFile("classTrans-", ".jar", new File(System.getProperty("java.io.tmpdir")));
@@ -55,10 +65,11 @@ public class ClassUtil {
} catch (IOException e) {
e.printStackTrace();
}
+ jarFile.deleteOnExit();
return jarFile;
}
- private static void buildElement(JarOutputStream out, String[] fileNames, String[] filePaths) throws IOException {
+ private void buildElement(JarOutputStream out, String[] fileNames, String[] filePaths) throws IOException {
for (int i = 0; i < fileNames.length; i++) {
ClassPathResource classPathResource = new ClassPathResource(filePaths[i]);
addJarFile(out, fileNames[i], classPathResource.getInputStream());
@@ -66,7 +77,7 @@ public class ClassUtil {
}
- private static void addJarFile(JarOutputStream out, String packagePath, InputStream in) {
+ private void addJarFile(JarOutputStream out, String packagePath, InputStream in) {
try {
out.putNextEntry(new JarEntry(packagePath));
byte[] buffer = new byte[1024];
@@ -81,5 +92,4 @@ public class ClassUtil {
e.printStackTrace();
}
}
-
}