We talked briefly about this at lunch today (nice to meet you Al!) but wanted to follow up here.....
The per-proxy request context can definitely come into play here. If any of the threads add a header list to the RequestContext via the method mentioned in #4 of: http://cxf.apache.org/faq#FAQ-HowcanIaddsoapheaderstotherequest%2Fresponse%3F then those headers would be sent on all methods called on the proxy. What's worse, I THINK that List is just copied into the real message context so any header processing done during the processing of the message would affect that list, thus affecting all threads as well as future method calls on the same thread. Thinking about this, it may make sense to clone the list at the very start of processing messages to make sure the header list in the request context isn't modified. That might be worth filing a jira for. For now, I would suggest doing 2 things: 1) Use the thread local request contexts: <jaxws:client id="xService" serviceClass="com.XService" address="#xServiceUrl" > <jaxws:properties> <entry key="thread.local.request.context" value="true" /> </jaxws:properties> </jaxws:client> 2) After returning from any method where you had set a header, call: context.getMessageContext().remove(Header.HEADER_LIST); That should keep things in a good state. Dan On Friday, July 22, 2011 10:25:10 AM Algirdas Veitas wrote: > Hi, > > We are getting a ConcurrentModificationException exception in our CXF > client, when it is processing SOAPHeaders. We did find this following > link that describes what is going on > http://cxf.547215.n5.nabble.com/jira-Created-CXF-2762-Cannot-deploy-csta-web > -service-td586662.html#a586663, and we will address that (Header object > needs to be unique across threads), but something else strange is > happening: > > To start here is our client setup > > <!-- Web Service Clients --> > <jaxws:client id="xService" > serviceClass="com.XService" > address="#xServiceUrl" /> > > This WSDL that is associate with this client has some methods that DO have a > Header and some DO NOT. > > And here is the shortened stack trace: > > <http://newportave.jira.com/wiki/display/21+Jul+2011+19/11%3A46%2C874> > java.util.ConcurrentModificationException > at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372) > at java.util.AbstractList$Itr.next(AbstractList.java:343) > at > org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor.writeSoapEnvelope > Start(SoapOutInterceptor.java:139) at > org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor.handleMessage(Soa > pOutInterceptor.java:81) at > org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor.handleMessage(Soa > pOutInterceptor.java:61) at > org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain > .java:255) at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:516) > > Here is the rub: This exception is being thrown when we are calling a method > that DOES NOT have a Header, but on line 139 in SoapOutInterceptor, it > looks like we are trying to process an list that has atleast 1 header. Am > pretty certain (this is occurring only in a specific environment) that > other methods on this service were made previous to this error that did > include a SOAP Header. Am speculating, but is the SOAP Header being cached > in the request context and the request context is scoped per client > instance as per the FAQ ( > http://cxf.apache.org/faq.html#FAQ-AreJAXWSclientproxiesthreadsafe%3F)? > > > Thanks, > Al -- Daniel Kulp [email protected] http://dankulp.com/blog Talend - http://www.talend.com
