Skip to content

Commit 94e5388

Browse files
committed
Reduce inits of MetroConfigLoader
Creating a MetroConfigLoader requires frequent class- and resource-loading, so re-use factories when applicable
1 parent ee7f1c7 commit 94e5388

File tree

1 file changed

+24
-2
lines changed

1 file changed

+24
-2
lines changed

jaxws-ri/runtime/rt/src/main/java/com/sun/xml/ws/assembler/TubelineAssemblyController.java

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
import com.sun.istack.NotNull;
1414
import com.sun.istack.logging.Logger;
15+
import com.sun.xml.ws.api.server.Container;
1516
import com.sun.xml.ws.assembler.dev.ClientTubelineAssemblyContext;
1617
import com.sun.xml.ws.assembler.dev.ServerTubelineAssemblyContext;
1718
import com.sun.xml.ws.resources.TubelineassemblyMessages;
@@ -23,6 +24,9 @@
2324
import java.net.URISyntaxException;
2425
import java.util.Collection;
2526
import java.util.LinkedList;
27+
import java.util.Map;
28+
import java.util.concurrent.ConcurrentHashMap;
29+
import java.util.concurrent.locks.ReentrantLock;
2630

2731
/**
2832
*
@@ -32,6 +36,11 @@ final class TubelineAssemblyController {
3236

3337
private final MetroConfigName metroConfigName;
3438

39+
private static final Map<Container, TubeFactoryList> tubeFactoryListCache = new ConcurrentHashMap<>();
40+
private static final ReentrantLock cacheLock = new ReentrantLock();
41+
private static final int MAX_CACHE_SIZE = 100;
42+
43+
3544
TubelineAssemblyController(MetroConfigName metroConfigName) {
3645
this.metroConfigName = metroConfigName;
3746
}
@@ -59,8 +68,21 @@ Collection<TubeCreator> getTubeCreators(ClientTubelineAssemblyContext context) {
5968
endpointUri = null;
6069
}
6170

62-
MetroConfigLoader configLoader = new MetroConfigLoader(context.getContainer(), metroConfigName);
63-
return initializeTubeCreators(configLoader.getClientSideTubeFactories(endpointUri));
71+
TubeFactoryList tubeFactoryList = tubeFactoryListCache.get(context.getContainer());
72+
if (tubeFactoryList == null) {
73+
MetroConfigLoader configLoader = new MetroConfigLoader(context.getContainer(), metroConfigName);
74+
tubeFactoryList = configLoader.getClientSideTubeFactories(endpointUri);
75+
cacheLock.lock();
76+
try {
77+
if (tubeFactoryListCache.size() >= MAX_CACHE_SIZE) {
78+
tubeFactoryListCache.remove(tubeFactoryListCache.keySet().iterator().next());
79+
}
80+
tubeFactoryListCache.put(context.getContainer(), tubeFactoryList);
81+
} finally {
82+
cacheLock.unlock();
83+
}
84+
}
85+
return initializeTubeCreators(tubeFactoryList);
6486
}
6587

6688
/**

0 commit comments

Comments
 (0)