2014-07-11 11 views
12

In Java EE7, il Client API JAX-RS fornisce un'API di alto livello per l'accesso a tutte le risorse di riposo. Secondo la documentazione, "I client sono oggetti pesanti che gestiscono l'infrastruttura di comunicazione lato client. L'inizializzazione e l'eliminazione di un'istanza Client possono essere un'operazione piuttosto costosa. Si consiglia pertanto di costruire solo un numero limitato di client istanze nell'applicazione. "è thread client JAX-RS sicuro

Per evitare di creare client frequentemente, ho intenzione di memorizzare nella cache l'istanza del client e riutilizzarla. Il thread delle istanze client è sicuro poiché può essere utilizzato da thread simultanei? C'è qualche problema di prestazioni se creo solo un'istanza del client e la riusiamo per tutte le richieste?

risposta

-3

Il JavaDoc è in gran parte rispondere alla tua domanda already- Sì è thread-safe e si può e deve riutilizzarlo. È possibile che si verifichi un problema di prestazioni da non riutilizzandolo, ad esempio se crei un client per ogni richiesta HTTP, la tua esecuzione risulterà davvero pessima.

+4

Dove lo dice il JavaDoc? https://docs.oracle.com/javaee/7/api/javax/ws/rs/client/Client.html Sono d'accordo con l'altra risposta (http://stackoverflow.com/a/27427911/57217) che questo sembra essere un argomento specifico per l'implementazione. Sicuramente non si dovrebbe creare un nuovo Client per ogni richiesta, ma non è sicuro utilizzarlo da più thread. – Kutzi

+0

Ho detto "principalmente" - "Si consiglia quindi di costruire solo un piccolo numero di istanze del Cliente". Considerando che hai ragione nel fatto che sarà specifico per l'implementazione, posso garantire che l'utilizzo del client Jersey sia sicuro da utilizzare da più thread. Ho un sistema di backend di volume molto alto che dice così! – tddmonkey

+5

Dipende dall'implementazione. Ad esempio: http://cxf.apache.org/docs/jax-rs-client-api.html#JAX-RSClientAPI-ThreadSafety –

13

non sono sicuro, ma penso che questa è una decisione specifica dell'implementazione.

non riuscivo a trovare nelle specifiche JAX-RS 2.0 né in tutto ciò Javadoc ammettendo che javax.ws.rs.client.Client è thread-safe. Ma nel Resteasy (un implementor di JAX-RS) la documentazione che ho trovato:

Un difetto decisione presa da HttpClient e adottata dal Resteasy è l'uso di org.apache.http.impl.conn.SingleClientConnManager, che gestisce una sola presa in un dato momento e che supporta il caso d'uso in cui uno o più chiamate sono realizzati in serie da un singolo thread. Per le applicazioni multithreaded, SingleClientConnManager può essere sostituita da org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager:

ClientConnectionManager cm = new ThreadSafeClientConnManager(); 
HttpClient httpClient = new DefaultHttpClient(cm); 
ApacheHttpClient4Engine engine = new ApacheHttpClient4Engine(httpClient); 

Fonte: http://docs.jboss.org/resteasy/docs/3.0.9.Final/userguide/html/RESTEasy_Client_Framework.html#transport_layer

sede a queste informazioni immagino che la risposta per la tua domanda è probabile che sia "no".

+0

Vedi anche http://stackoverflow.com/questions/22257258/threadsafeclientconnmanager – Renan

+2

Puoi fare now: 'new ResteasyClientBuilder(). connectionPoolSize (10) ...' per creare un ResteasyClient thread-safe – Kutzi

+0

Controlla la mia risposta qui http://stackoverflow.com/a/38343094/345718 per una soluzione restia. – Patrick