On Friday, July 22, 2011 3:58:06 PM Algirdas Veitas wrote: > Hi Daniel, > > Nice meeting you as well!
Just discovered you and I went to Northeastern at roughly the same time. We may have met before. :-) > One follow up question....the way we are adding headers is #3. Our > generated client code treats our headers like an ordinary parameter in the > method signature. Will your solution work for this strategy as well? Hmm... with #3, you shouldn't even be hitting this. The HEADER_LIST should be completely created per request since it wouldn't be pulled from the request context. However, if the HEADER_LIST is added to the request context at ANY time, even using #3 after that would cause an issue. If you aren't touching the HEADER_LIST anywhere, then I'm not really sure what is going on. Strange. Definitely give it a try though. Dan > > Al > > On Fri, Jul 22, 2011 at 3:45 PM, Daniel Kulp <[email protected]> wrote: > > 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%2Frespon > > se%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%2C87 > > > 4> > > > 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.writeSoapEnve > > lope > > > > > 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(PhaseInterceptorC > > hain > > > > > .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%3 > > > F)? > > > > > > > > > Thanks, > > > Al > > > > -- > > Daniel Kulp > > [email protected] > > http://dankulp.com/blog > > Talend - http://www.talend.com -- Daniel Kulp [email protected] http://dankulp.com/blog Talend - http://www.talend.com
