You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by Fred Dushin <fr...@dushin.net> on 2007/03/19 15:51:52 UTC

Thread-safety (or lack thereof) of Request/Response contexts

Sorry, this is another naive JAX-WS question.

The CXF documentation at http://cwiki.apache.org/CXF20DOC/developing- 
a-consumer.html illustrates a pattern for implementing a CXF client.   
Under the section "Setting a request context" and "Reading a response  
context", the following code is presented:

{{{
// Set request context property.
java.util.Map<String, Object> requestContext =
   ((javax.xml.ws.BindingProvider)port).getRequestContext();
requestContext.put(ContextPropertyName, PropertyValue);

// Invoke an operation.
port.SomeOperation();

// Read response context property.
java.util.Map<String, Object> responseContext =
   ((javax.xml.ws.BindingProvider)port).getResponseContext();
PropertyType propValue = (PropertyType) responseContext.get 
(ContextPropertyName);
}}}

My question is, in a multi-threaded application, where say the client  
proxy (port, in the above example) is shared across threads, there  
are presumably no guarantees about the thread-safety of the use of  
the client-request or response objects, no?  Or are implementations  
free to "return" a context object out of thread-local storage, for  
example?  Does anyone know what the CXF behavior is here?

I guess what I need to know is, is the functionally correct way to  
use the above pattern to wrap it in a synchronized block (thus losing  
any scalability in the client)?  Or is the above pattern thread-safe  
(under the assumption that port may be shared across threads)?

Thanks!
-Fred

Re: Thread-safety (or lack thereof) of Request/Response contexts

Posted by Willem Jiang <ni...@iona.com>.
Hi Fred,

I can't say the client proxy guarantees the thread-safety of use the 
request/ response contexts.
Because the request and response contexts are the no thread-local 
objects of the JaxWsClientProxy which implements the  BindingProvider 
interface.

I filled a Jira *CXF-470 
<https://issues.apache.org/jira/browse/CXF-470>* [1]  for it, and will 
make it thread-safe :).

[1] https://issues.apache.org/jira/browse/CXF-470

Cheers,

Willem.

Fred Dushin wrote:

>
> Sorry, this is another naive JAX-WS question.
>
> The CXF documentation at http://cwiki.apache.org/CXF20DOC/developing- 
> a-consumer.html illustrates a pattern for implementing a CXF client.   
> Under the section "Setting a request context" and "Reading a response  
> context", the following code is presented:
>
> {{{
> // Set request context property.
> java.util.Map<String, Object> requestContext =
>   ((javax.xml.ws.BindingProvider)port).getRequestContext();
> requestContext.put(ContextPropertyName, PropertyValue);
>
> // Invoke an operation.
> port.SomeOperation();
>
> // Read response context property.
> java.util.Map<String, Object> responseContext =
>   ((javax.xml.ws.BindingProvider)port).getResponseContext();
> PropertyType propValue = (PropertyType) responseContext.get 
> (ContextPropertyName);
> }}}
>
> My question is, in a multi-threaded application, where say the client  
> proxy (port, in the above example) is shared across threads, there  
> are presumably no guarantees about the thread-safety of the use of  
> the client-request or response objects, no?  Or are implementations  
> free to "return" a context object out of thread-local storage, for  
> example?  Does anyone know what the CXF behavior is here?
>
> I guess what I need to know is, is the functionally correct way to  
> use the above pattern to wrap it in a synchronized block (thus losing  
> any scalability in the client)?  Or is the above pattern thread-safe  
> (under the assumption that port may be shared across threads)?
>
> Thanks!
> -Fred
>