cxf-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Freeman Fang (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (CXF-3558) JaxWsProxyFactoryBean.create is not thread-safe
Date Tue, 31 May 2011 09:50:47 GMT

    [ 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

Mime
View raw message