Il thread client JAX-RS è sicuro

In Java EE7, l’API client JAX-RS fornisce un’API di alto livello per l’accesso a qualsiasi risorsa REST. 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, pertanto si consiglia di build solo un numero limitato di istanze client. nell’applicazione. “

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?

Il JavaDoc risponde principalmente alla tua domanda già – sì è sicuro per i thread e puoi e dovresti riutilizzarlo. Ci può essere un problema di prestazioni dal non riusarlo, cioè se crei un Client per ogni richiesta HTTP che rendi la tua performance risulterà davvero pessima.

Non sono sicuro, ma penso che questa sia una decisione specifica per l’implementazione.

Non sono riuscito a trovare nella specifica JAX-RS 2.0 né nel Javadoc qualcosa che garantisca che javax.ws.rs.client.Client sia thread-safe. Ma nella documentazione Resteasy (un implementatore di JAX-RS) ho trovato:

Una decisione predefinita adottata da HttpClient e adottata da Resteasy è l’uso di org.apache.http.impl.conn.SingleClientConnManager, che gestisce un singolo socket in qualsiasi momento e che supporta il caso d’uso in cui una o più chiamate sono fatte in serie da un singolo thread. Per le applicazioni con multithreading, SingleClientConnManager può essere sostituito 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

Basandomi su queste informazioni, suppongo che la risposta alla tua domanda sia probabilmente “no”.