[ https://issues.apache.org/jira/browse/CXF-6963?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
RANADEEP SHARMA updated CXF-6963: --------------------------------- Description: Hi, I have a overridden factory for JaxWS proxy clients, as shown below. I created this class as per the link - http://cxf.apache.org/faq.html#FAQ%2DAreJAX%2DWSclientproxiesthreadsafe%3F. Here's the spring config -------------------------------- <bean id="proxyFactory" class="com.vcf.soap.jaxws.TSafeJaxWsProxyFactoryBean"> <property name="serviceClass" value="com.vcf.ws.stubs.session.SessionManagerService"/> <property name="address" value="${session.manager.service.uri} "/> </bean> <bean id="sessionManagerServiceClient" class="com.vcf.ws.stubs.session.SessionManagerService" factory-bean="proxyFactory" factory-method="create"/> <bean id="sessionManagerWrapper" class="com.vcf.services.session.wrapper.SessionManagerWrapperImpl"> <property name="sessionManagerService" ref="sessionManagerServiceClient" /> <property name="endpointUri" value="${session.manager.service.uri}" /> </bean> Here goes the classes -------------------------------- public class TSafeJaxWsProxyFactoryBean extends JaxWsProxyFactoryBean { public TSafeJaxWsProxyFactoryBean() { super(); } public TSafeJaxWsProxyFactoryBean(ClientFactoryBean fact) { super(fact); } @Override protected ClientProxy clientClientProxy(Client c) { ClientProxy clientProxy = super.clientClientProxy(c); clientProxy.getRequestContext().put("thread.local.request.context", "true"); return clientProxy; } } In my application, I have 2 methods that use the proxy created by the above factory. One method - getSessionInfo() populates the BindingProvider.ENDPOINT_ADDRESS_PROPERTY into the RequestContext before the service call. Another method - startSession() just calls service without populating above property. public class SessionManagerWrapperImpl { public SessionInfo startSession() { ... Map<String, Object> requestContext = ((BindingProvider) sessionManagerService).getRequestContext(); if(requestContext.containsKey(BindingProvider.ENDPOINT_ADDRESS_PROPERTY)) { requestContext.remove(BindingProvider.ENDPOINT_ADDRESS_PROPERTY); } ... // Make service call using 'sessionManagerService' ... } public SessionInfo getSessionInfo(String sessionId) { ((BindingProvider) sessionManagerService).getRequestContext() .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointUri + ";jsessionid=" + sessionId); SessionInfo result = sessionManagerService.getSessionInfo(sessionId); } } Now, I am getting into a situation where RequestContext is already having the mentioned property for the thread processing startSession(). This is not expected, since CXF documentation claims the explained usage to be thread-safe. Please let me know if my understanding and implementation is correct. However, if my usage is correct, is there a possible bug in CXF? NOTE : I have already created a user thread - http://cxf.547215.n5.nabble.com/CXF-client-for-JaxWS-proxy-NOT-thread-safe-tt5770148.html was: Hi, I have a overridden factory for JaxWS proxy clients, as shown below. I created this class as per the link - http://cxf.apache.org/faq.html#FAQ%2DAreJAX%2DWSclientproxiesthreadsafe%3F. Here's the spring config -------------------------------- <bean id="proxyFactory" class="com.vcf.soap.jaxws.TSafeJaxWsProxyFactoryBean"> <property name="serviceClass" value="com.vcf.ws.stubs.session.SessionManagerService"/> <property name="address" value="${session.manager.service.uri}"/> </bean> <bean id="sessionManagerServiceClient" class="com.vcf.ws.stubs.session.SessionManagerService" factory-bean="proxyFactory" factory-method="create"/> <bean id="sessionManagerWrapper" class="com.vcf.services.session.wrapper.SessionManagerWrapperImpl"> <property name="sessionManagerService" ref="sessionManagerServiceClient" /> <property name="endpointUri" value="${session.manager.service.uri}" /> </bean> Here goes the classes -------------------------------- public class TSafeJaxWsProxyFactoryBean extends JaxWsProxyFactoryBean { public TSafeJaxWsProxyFactoryBean() { super(); } public TSafeJaxWsProxyFactoryBean(ClientFactoryBean fact) { super(fact); } @Override protected ClientProxy clientClientProxy(Client c) { ClientProxy clientProxy = super.clientClientProxy(c); clientProxy.getRequestContext().put("thread.local.request.context", "true"); return clientProxy; } } In my application, I have 2 methods that use the proxy created by the above factory. One method - getSessionInfo() populates the BindingProvider.ENDPOINT_ADDRESS_PROPERTY into the RequestContext before the service call. Another method - startSession() just calls service without populating above property. public class SessionManagerWrapperImpl { public SessionInfo startSession() { ... Map<String, Object> requestContext = ((BindingProvider) sessionManagerService).getRequestContext(); if(requestContext.containsKey(BindingProvider.ENDPOINT_ADDRESS_PROPERTY)) { requestContext.remove(BindingProvider.ENDPOINT_ADDRESS_PROPERTY); } ... // Make service call using 'sessionManagerService' ... } public SessionInfo getSessionInfo(String sessionId) { ((BindingProvider) sessionManagerService).getRequestContext() .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointUri + ";jsessionid=" + sessionId); SessionInfo result = sessionManagerService.getSessionInfo(sessionId); } } Now, I am getting into a situation where RequestContext is already having the mentioned property for the thread processing startSession(). This is not expected, since CXF documentation claims the explained usage to be thread-safe. Please let me know if my understanding and implementation is correct. However, if my usage is correct, is there a possible bug in CXF? NOTE : I have already created a user thread - http://cxf.547215.n5.nabble.com/CXF-client-for-JaxWS-proxy-NOT-thread-safe-tt5770148.html > Setting ThreadLocal specific property on RequestContext is still not > thread-safe > -------------------------------------------------------------------------------- > > Key: CXF-6963 > URL: https://issues.apache.org/jira/browse/CXF-6963 > Project: CXF > Issue Type: Bug > Components: JAX-WS Runtime > Affects Versions: 3.1.0, 3.1.6 > Environment: Redhat Enterprise Linux (Santiago), OpenJDK 7, Tomcat 7 > Reporter: RANADEEP SHARMA > > Hi, > I have a overridden factory for JaxWS proxy clients, as shown below. I > created this class as per the link - > http://cxf.apache.org/faq.html#FAQ%2DAreJAX%2DWSclientproxiesthreadsafe%3F. > Here's the spring config > -------------------------------- > <bean id="proxyFactory" > class="com.vcf.soap.jaxws.TSafeJaxWsProxyFactoryBean"> > <property name="serviceClass" > value="com.vcf.ws.stubs.session.SessionManagerService"/> > <property name="address" value="${session.manager.service.uri} "/> > </bean> > <bean id="sessionManagerServiceClient" > class="com.vcf.ws.stubs.session.SessionManagerService" > factory-bean="proxyFactory" factory-method="create"/> > <bean id="sessionManagerWrapper" > class="com.vcf.services.session.wrapper.SessionManagerWrapperImpl"> > <property name="sessionManagerService" > ref="sessionManagerServiceClient" /> > <property name="endpointUri" value="${session.manager.service.uri}" /> > </bean> > Here goes the classes > -------------------------------- > public class TSafeJaxWsProxyFactoryBean extends JaxWsProxyFactoryBean { > public TSafeJaxWsProxyFactoryBean() { > super(); > } > public TSafeJaxWsProxyFactoryBean(ClientFactoryBean fact) { > super(fact); > } > @Override > protected ClientProxy clientClientProxy(Client c) { > ClientProxy clientProxy = super.clientClientProxy(c); > clientProxy.getRequestContext().put("thread.local.request.context", > "true"); > return clientProxy; > } > } > In my application, I have 2 methods that use the proxy created by the above > factory. One method - getSessionInfo() populates the > BindingProvider.ENDPOINT_ADDRESS_PROPERTY into the RequestContext before the > service call. Another method - startSession() just calls service without > populating above property. > public class SessionManagerWrapperImpl { > public SessionInfo startSession() { > ... > Map<String, Object> requestContext = ((BindingProvider) > sessionManagerService).getRequestContext(); > > if(requestContext.containsKey(BindingProvider.ENDPOINT_ADDRESS_PROPERTY)) { > requestContext.remove(BindingProvider.ENDPOINT_ADDRESS_PROPERTY); > } > ... > // Make service call using 'sessionManagerService' > ... > } > > public SessionInfo getSessionInfo(String sessionId) { > ((BindingProvider) sessionManagerService).getRequestContext() > .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointUri + > ";jsessionid=" + sessionId); > > SessionInfo result = sessionManagerService.getSessionInfo(sessionId); > } > } > Now, I am getting into a situation where RequestContext is already having the > mentioned property for the thread processing startSession(). This is not > expected, since CXF documentation claims the explained usage to be > thread-safe. > Please let me know if my understanding and implementation is correct. > However, if my usage is correct, is there a possible bug in CXF? > NOTE : I have already created a user thread - > http://cxf.547215.n5.nabble.com/CXF-client-for-JaxWS-proxy-NOT-thread-safe-tt5770148.html -- This message was sent by Atlassian JIRA (v6.3.4#6332)