[
https://issues.apache.org/jira/browse/CXF-6513?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Sergey Beryozkin resolved CXF-6513.
-----------------------------------
Resolution: Fixed
Assignee: Sergey Beryozkin
Fix Version/s: 3.0.2
I believe it was fixed OK, any concerns - let me know please
> CXF Using async WebClient with load distribution failover strategy leads to
> memory leak
> ---------------------------------------------------------------------------------------
>
> Key: CXF-6513
> URL: https://issues.apache.org/jira/browse/CXF-6513
> Project: CXF
> Issue Type: Bug
> Components: JAX-RS
> Affects Versions: 3.0.1
> Reporter: Mike
> Assignee: Sergey Beryozkin
> Fix For: 3.0.2
>
>
> I encountered strange behaviour with using async WebClient. For case of
> example I create JAXRSClientFactoryBean with failover strategy:
> {noformat}
> FailoverFeature feature = new FailoverFeature();
> feature.setTargetSelector(new LoadDistributorTargetSelector());
> List<String> alternateAddresses = new ArrayList<String>();
> // addresses are alternate addresses provided at start-up
> alternateAddresses.add("http://localhost:1234");
> alternateAddresses.add("http://localhost:5678");
> SequentialStrategy strategy = new SequentialStrategy();
> strategy.setAlternateAddresses(alternateAddresses);
> feature.setStrategy(strategy);
> JAXRSClientFactoryBean factoryBean = new JAXRSClientFactoryBean();
> factoryBean.setAddress("http://localhost:1234"); // setting initial
> address
> LoadDistributorTargetSelector targetSelector = new
> LoadDistributorTargetSelector();
> targetSelector.setStrategy(strategy);
> factoryBean.setConduitSelector(targetSelector);
> factoryBean.setServiceClass(SomeService.class);
> List<Feature> features = new ArrayList<Feature>();
> features.add(feature);
> factoryBean.setFeatures(features);
> WebClient webClient = factoryBean.createWebClient();
> {noformat}
> Next I am making invocation of my request:
> {noformat}
> Future<Response> post =
> webClient.path("service/path").async().post(Entity.json(request));
> {noformat}
> After running about 200~300 requests I observed huge memory usage of my
> component. Made heapdump and investigated that
> org.apache.cxf.clustering.LoadDistributorTargetSelector is keeping much data
> in ConcurrentHashMap (and this data is never released in case os
> AsyncInvoker):
> {noformat}
> protected ConcurrentHashMap<InvocationKey, InvocationContext> inProgress
> = new ConcurrentHashMap<InvocationKey, InvocationContext>();
> public void prepare(Message message) {
> ...
> inProgress.putIfAbsent(key, invocation);
> }
> {noformat}
> Everything would be fine if that map was cleared after the request but in
> case of AsyncInvoker it is not and quickly leads to OutOfMemoryError. In
> SyncInvoker map is being cleared by FailoverTargetSelector class:
> {noformat}
> public void complete(Exchange exchange) {
> ...
> if (!failover) {
> inProgress.remove(key);
> doComplete(exchange);
> }
> {noformat}
> Any ideas is it indeed a bug ? Or I am missing something.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)