[
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)