I have a simple question that I just want some verification on with multi-threading/singleton/BindingProvider.
We are using CXF 2.4.5, Spring 3.0.5, and we have a DefaultMessageListenerContainer that has a min/max of 5/10 consumers. Within that class, we have a remote service that we will be calling, but we have to manage cookies for stateful invocation. The remote service interface is a class level variable like this example from Spring below, that is set to the default scope of singleton: http://static.springsource.org/spring/docs/3.0.x/reference/beans.html#beans-factory-class-instance-factory-method public class BusinessLogicServiceImpl implements BusinessLogicService { private transient AccessServiceRemote accessServiceRemote; <bean id="businessLogicService " class="com.foo.BusinessLogicServiceImpl" p:accessServiceRemote-ref="accessServiceRemote"/> <bean id="accessServiceRemote" class="com.foo.accessService" factory-bean="accessServiceProxyFactory" factory-method="create" lazy-init="false"/> <bean id="accessServiceProxyFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean" lazy-init="true"> <property name="serviceClass" value="com.foo.accessService"/> <property name="address" value="${external.url}"/> </bean> In order to do stateful invocations, we have to determine if the service is proxied by BindingProvider so that we can use BindingProvider to getRequestContext and then put a user context id into the HTTP Headers for all calls (after our 3rd party login). if (Proxy.isProxyClass(service.getClass()) && BindingProvider.class.isAssignableFrom(service.getClass())) { Map<String, Object> requestContext = ((BindingProvider) service).getRequestContext(); if (MapUtils.isNotEmpty(requestContext)) { if (!startState) { requestContext.put(MessageContext.HTTP_REQUEST_HEADERS, HttpHeaderThreadLocal.getHttpHeader(stateId.getUserContextId())); } } } My concern is that the remote service class level variable accessServiceRemote is instantiated via Spring's default scope of singleton (via JaxWsProxyFactoryBean). So I would assume that multiple threads will set the HTTP Headers (via the requestContext.put) and keep stepping on each other, causing a threading issue. Should it just be as simple as changing the scope on the accessServiceRemote to prototype? <bean id="accessServiceRemote" class="com.foo.AccessServiceRemote" factory-bean="accessServiceProxyFactory" factory-method="create" lazy-init="false" scope="prototype"/> Thanks...jay -- View this message in context: http://cxf.547215.n5.nabble.com/JaxWsProxyFactoryBean-multi-threaded-stateful-services-tp5719659.html Sent from the cxf-user mailing list archive at Nabble.com.
