[
https://issues.apache.org/jira/browse/CXF-3558?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13041504#comment-13041504
]
Freeman Fang commented on CXF-3558:
-----------------------------------
Hi,
Thanks for your clarification.
I get your point, so if your factory won't change any properties once
configured, we can synchronized ClientProxyFactoryBean create() method, as well
as use ModCountCopyOnWriteArrayList for ListenerList, ensure that the proxy
creation is thread safe.
Freeman
> JaxWsProxyFactoryBean.create is not thread-safe
> -----------------------------------------------
>
> Key: CXF-3558
> URL: https://issues.apache.org/jira/browse/CXF-3558
> Project: CXF
> Issue Type: Bug
> Components: JAX-WS Runtime
> Affects Versions: 2.4
> Reporter: Tomasz Nurkiewicz
> Assignee: Freeman Fang
> Attachments: CXF-3558.txt
>
>
> While running {{JaxWsProxyFactoryBean.create}} concurrently I encountered the
> following exception:
> {code}Caused by: java.util.ConcurrentModificationException
> at
> java.util.LinkedList$ListItr.checkForComodification(LinkedList.java:761)
> at java.util.LinkedList$ListItr.next(LinkedList.java:696)
> at
> org.apache.cxf.service.factory.AbstractServiceFactoryBean.sendEvent(AbstractServiceFactoryBean.java:71)
> at
> org.apache.cxf.service.factory.ReflectionServiceFactoryBean.create(ReflectionServiceFactoryBean.java:238)
> at
> org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.create(JaxWsServiceFactoryBean.java:202)
> at
> org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpoint(AbstractWSDLBasedEndpointFactory.java:101)
> at
> org.apache.cxf.frontend.ClientFactoryBean.create(ClientFactoryBean.java:90)
> at
> org.apache.cxf.frontend.ClientProxyFactoryBean.create(ClientProxyFactoryBean.java:152)
> at
> org.apache.cxf.jaxws.JaxWsProxyFactoryBean.create(JaxWsProxyFactoryBean.java:142)
> {code}
> Although not documented (?),
> {{org.apache.cxf.service.factory.ReflectionServiceFactoryBean#create}} called
> somewhere during endpoint creation is {{synchronized}} which suggests whole
> {{create}} is thread-safe, but apparently it's not.
> I managed to discover source of this problem. I captured two threads: one
> ({{pool-1-thread-4}}) entered synchronized
> {{ReflectionServiceFactoryBean#create}}, the second one ({{pool-1-thread-2}})
> didn't made there yet but instead it calls
> {{AbstractServiceFactoryBean.setBus}} outside of the {{synchronized}} block.
> This causes the
> {{org.apache.cxf.service.factory.AbstractServiceFactoryBean#listeners}} to be
> updated, making the former thread being susceptible to
> {{ConcurrentModificationException}}. Stack dumps attached.
> Please either fix concurrency issue (making {{listeners}} instance of
> {{java.util.concurrent.CopyOnWriteArrayList}} might not be enough though) or
> document that {{JaxWsProxyFactoryBean.create}} is not thread-safe.
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira