Skip to content

Commit a85bea4

Browse files
authored
fix: thread context classloader propagation in forkjoinpool (#466)
1 parent 275faa1 commit a85bea4

File tree

3 files changed

+16
-13
lines changed

3 files changed

+16
-13
lines changed

arex-instrumentation-api/src/main/java/io/arex/inst/runtime/listener/EventProcessor.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,13 @@ private static void addEnterLog() {
6666
/**
6767
* user loader to load serializer, ex: ParallelWebappClassLoader
6868
*/
69-
private static void initSerializer() {
69+
private static void initSerializer(ClassLoader contextClassLoader) {
7070
if (!existJacksonDependency) {
7171
AdviceClassesCollector.INSTANCE.appendToClassLoaderSearch("jackson",
72-
Thread.currentThread().getContextClassLoader());
72+
contextClassLoader);
7373
}
7474
Serializer.initSerializerConfigMap();
75-
final List<StringSerializable> serializableList = ServiceLoader.load(StringSerializable.class, Thread.currentThread().getContextClassLoader());
75+
final List<StringSerializable> serializableList = ServiceLoader.load(StringSerializable.class, contextClassLoader);
7676
Serializer.builder(serializableList).build();
7777
}
7878

@@ -114,19 +114,21 @@ public static void onExit(){
114114
*/
115115
public static void onRequest(){
116116
if (INIT_DEPENDENCY.compareAndSet(InitializeEnum.START, InitializeEnum.RUNNING)) {
117+
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
118+
// https://bugs.openjdk.org/browse/JDK-8172726
117119
CompletableFuture.runAsync(() -> {
118-
initSerializer();
119-
initLog();
120-
RequestHandlerManager.init();
120+
initSerializer(contextClassLoader);
121+
initLog(contextClassLoader);
122+
RequestHandlerManager.init(contextClassLoader);
121123
INIT_DEPENDENCY.set(InitializeEnum.COMPLETE);
122124
});
123125
}
124126
TimeCache.remove();
125127
ContextManager.remove();
126128
}
127129

128-
private static void initLog() {
129-
List<Logger> extensionLoggerList = ServiceLoader.load(Logger.class, Thread.currentThread().getContextClassLoader());
130+
private static void initLog(ClassLoader contextClassLoader) {
131+
List<Logger> extensionLoggerList = ServiceLoader.load(Logger.class, contextClassLoader);
130132
LogManager.build(extensionLoggerList);
131133
}
132134
}

arex-instrumentation-api/src/main/java/io/arex/inst/runtime/request/RequestHandlerManager.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
public class RequestHandlerManager {
1313
private static final Map<String, List<RequestHandler>> REQUEST_HANDLER_CACHE = new ConcurrentHashMap<>();
1414

15-
public static void init() {
16-
final List<RequestHandler> requestHandlers = ServiceLoader.load(RequestHandler.class);
15+
public static void init(ClassLoader contextClassLoader) {
16+
final List<RequestHandler> requestHandlers = ServiceLoader.load(RequestHandler.class, contextClassLoader);
1717
final Map<String, List<RequestHandler>> requestHandlerMap = requestHandlers.stream().collect(Collectors.groupingBy(RequestHandler::name));
1818
REQUEST_HANDLER_CACHE.putAll(requestHandlerMap);
1919
}

arex-instrumentation-api/src/test/java/io/arex/inst/runtime/request/RequestHandlerManagerTest.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ class RequestHandlerManagerTest {
1515

1616
@BeforeAll
1717
static void setUp() {
18+
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
1819
Mockito.mockStatic(ServiceLoader.class);
1920
requestHandler = Mockito.mock(RequestHandler.class);
2021
requestHandlerError = Mockito.mock(RequestHandler.class);
@@ -23,8 +24,8 @@ static void setUp() {
2324
Mockito.doThrow(new RuntimeException()).when(requestHandlerError).preHandle("request");
2425
Mockito.doThrow(new RuntimeException()).when(requestHandlerError).handleAfterCreateContext("request");
2526
Mockito.doThrow(new RuntimeException()).when(requestHandlerError).postHandle("request", "response");
26-
Mockito.when(ServiceLoader.load(RequestHandler.class)).thenReturn(Arrays.asList(requestHandler, requestHandlerError));
27-
RequestHandlerManager.init();
27+
Mockito.when(ServiceLoader.load(RequestHandler.class, classLoader)).thenReturn(Arrays.asList(requestHandler, requestHandlerError));
28+
RequestHandlerManager.init(classLoader);
2829
}
2930

3031
@AfterAll
@@ -71,4 +72,4 @@ void postHandle() {
7172
// error
7273
assertDoesNotThrow(() -> RequestHandlerManager.postHandle("request", "response", "testError"));
7374
}
74-
}
75+
}

0 commit comments

Comments
 (0)