We have a service within our webapp that connects to another RESTful service 
using the JAX-RS Client API. We deploy to Wildfly 8.2, which is of course uses 
RESTEasy. This service is a singleton and will receive many concurrent requests.

I'd like to know if I can safely re-use the 'javax.ws.rs.client.Client' and 
'javax.ws.rs.client.WebTarget' instances and just close each 
'javax.ws.rs.core.Response' for each request that our service makes? 

In other words I'd like to initialize my Client and WebTarget instances once 
when my service starts up and only close the Client only our service shuts 
down. For each of the concurrent requests that our service receives, it will 
execute a new request and close the Response.

In researching this online and such, I come across different answers and I'd 
like to find out what's the correct one.

In the book "RESTful Java with JAX-RS 2.0 (2nd edition)" by Burke, I see the 
following relevant statements:
 
1. "The javax.ws.rs.client.Client interface is the main entry point into the 
JAX-RS Client API. Client instances manage client socket connections and are 
pretty heavyweight. Instances of this interface should be reused wherever 
possible, as it can be quite expensive to create and destroy these objects."

2. "WARNING: Always remember to close() your Client objects. Client objects 
often pool connections for performance reasons. If you do not close them, you 
are leaking valuable system resources. While most JAX-RS implementations 
implement a finalize() method for Client, it is not a good idea to rely on the 
garbage collector to clean up poorly written code."

3. "WARNING: Always remember to close() your Response objects. Response objects 
reference open socket streams. If you do not close them, you are leaking system 
resources. While most JAX-RS implementations implement a finalize() method for 
Response, it is not a good idea to rely on the garbage collector to clean up 
poorly written code. The default behavior of the RESTEasy JAX-RS implementation 
actually only lets you have one open Response per Client instance. This forces 
you to write responsible client code."

What's confusing here is that in quote 1, it's recommended that we reuse the 
Client instance, but quote 3 ends by stating that RESTEasy only lets you have 
one open Response per Client. When we have multiple concurrent requests hitting 
our service, we'll need to have multiple JAX-RS Client Request-Response cycles 
happen at once. Isn't this one of the use cases where we should reuse the 
Client instance?

I also see two conflicting response to the following StackOverflow post: 
http://stackoverflow.com/questions/24700798/is-jax-rs-client-thread-safe

Also if I read the 2nd response to that StackOverflow post correctly, I believe 
I should manually supply the ThreadSafeClientConnManager() for my use case. Is 
that correct?

Thanks,
Peter Luttrell
------------------------------------------------------------------------------
Don't Limit Your Business. Reach for the Cloud.
GigeNET's Cloud Solutions provide you with the tools and support that
you need to offload your IT needs and focus on growing your business.
Configured For All Businesses. Start Your Cloud Today.
https://www.gigenetcloud.com/
_______________________________________________
Resteasy-users mailing list
Resteasy-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/resteasy-users

Reply via email to