You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by Bruno Melloni <Br...@chickasaw.net> on 2010/02/02 20:19:58 UTC
RE: Spring/CXF is it thread-safe?
I implemented these changes and for the most part they works. But occasionally a call fail on the client side, even though it seems to complete successfully on the server side. I am not sure if the failure is due to the client multi-threading or not. If it is not, it is very strange because the server-side process is very simple and quick, just a small update to the database. Even so, I plan on increasing the client receive timeout but it should not really be necessary.
Any help interpreting the errors would be quite helpful.
This is the exception I see:
2010-02-02 12:33:39,164 ERROR [Thread-2] MbErrorMgr - [LCEIT1664,2]Error recording work assignment results.
javax.xml.ws.soap.SOAPFaultException: Could not send Message.
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:141)
at $Proxy61.recordWorkUnitResults(Unknown Source)
at net.cndc.massbatch.client.ProcessBatchThread.recordWorkUnitResults(ProcessBatchThread.java:96)
at net.cndc.massbatch.client.ProcessBatchThread.run(ProcessBatchThread.java:51)
Caused by: java.net.SocketTimeoutException: Read timed out
-----Original Message-----
From: Daniel Kulp [mailto:dkulp@apache.org]
Sent: Thursday, January 21, 2010 1:56 PM
To: users@cxf.apache.org
Cc: Bruno Melloni
Subject: Re: Spring/CXF <jaxws:client> is it thread-safe?
Yea. That all looks correct.
Dan
On Wed January 20 2010 4:42:21 pm Bruno Melloni wrote:
> Thank you Daniel,
>
> I was afraid there would be issues. Unfortunately the FAQ doesn't explain
> how to do make the client calls threadsafe when using Spring.
>
> I took a stab at combining your reply with the FAQ instructions and how I
> currently make CXF service calls with Spring. Could you (or anybody)
> please look at it and correct me if I got it wrong?
>
> 1) In the client, get a reference to the proxy:
>
> ApplicationContext context = new ClassPathXmlApplicationContext(
> new String[] {"mySpringContext-client.xml"});
> MyClientIF client = (MyClientIF)context.getBean("myServiceClientBeanID");
>
> 2) Set the service client bean's requestContext to thread.local (presumably
> the bean implements the BindingProvider interface automatically):
>
> ((BindingProvider)client).getRequestContext().put("thread.local.request.con
> text", "true");
>
> 3) Pass 'client' to the threads.
>
> 4) The threads call the service methods (presumably CXF calls
> .requestContext() automatically as part of the service call):
>
> client.MyMethod();
>
>
> Thanks,
>
> bruno
>
> -----Original Message-----
> From: Daniel Kulp [mailto:dkulp@apache.org]
> Sent: Wednesday, January 20, 2010 2:58 PM
> To: users@cxf.apache.org
> Cc: Bruno Melloni
> Subject: Re: Spring/CXF <jaxws:client> is it thread-safe?
>
>
> See the faq:
> http://cxf.apache.org/faq.html
>
> Basically, if you use the request context, you could have issues if you
> don't set the request context to be thread local.
>
> Dan
>
> On Wed January 20 2010 12:49:22 pm Bruno Melloni wrote:
> > The approach of relying on Spring to get the CXF client object from the
> > context is so convenient that I rarely think much about it.
> >
> > But I find myself needing to call the client from several concurrent
> > threads and I am not sure but I believe that when I call
> > context.getBean() I am retrieving a singleton instance of the client
> > object. Is that going to be an issue when I call the same service method
> > from multiple threads?
> >
> > The code behind the service call is already thread-safe. If I were
> > calling it locally from multiple threads it would not be a problem.
>
--
Daniel Kulp
dkulp@apache.org
http://www.dankulp.com/blog