2014-07-11 7 views
12

In Java EE7 bietet die JAX-RS-Client-API eine High-Level-API für den Zugriff auf alle REST-Ressourcen. Gemäß der Dokumentation, "Clients sind schwergewichtige Objekte, die die clientseitige Kommunikationsinfrastruktur verwalten. Die Initialisierung sowie die Entsorgung einer Client-Instanz kann eine ziemlich teure Operation sein. Es wird daher empfohlen, nur eine kleine Anzahl von Clients zu erstellen Instanzen in der Anwendung. "Ist JAX-RS Client Thread sicher

Um zu vermeiden, Client häufig zu erstellen, werde ich die Client-Instanz zwischenspeichern und wiederverwenden. Ist der Client-Instanz-Thread sicher, da er von gleichzeitigen Threads verwendet werden kann? Gibt es ein Leistungsproblem, wenn ich nur eine Instanz des Clients erstellen und für alle Anforderungen wiederverwenden?

Antwort

-3

Das JavaDoc beantwortet Ihre Frage meist schon - ja es ist threadsicher und Sie können und sollten es wiederverwenden. Es kann ein Leistungsproblem von nicht Wiederverwendung geben, d. H., Wenn Sie einen Client für jede HTTP-Anfrage erstellen, wird Ihre Leistung wirklich schlecht werden.

+4

Wo sagt das JavaDoc? https://docs.oracle.com/javaee/7/api/javax/ws/rs/client/Client.html Ich stimme mit der anderen Antwort (http://stackoverflow.com/a/27427911/57217) überein Dies scheint ein umsetzungsspezifisches Thema zu sein. Sicherlich sollten Sie nicht für jede Anforderung einen neuen Client erstellen, aber es ist auch nicht sicher, ihn aus mehreren Threads zu verwenden. – Kutzi

+0

Ich sagte "meistens" - "Es wird daher empfohlen, nur eine kleine Anzahl von Client-Instanzen zu erstellen". Während Sie recht haben, dass es umsetzungsspezifisch sein wird, kann ich garantieren, dass die Verwendung des Jersey-Clients IS aus mehreren Threads sicher ist. Ich habe ein Back-End-System mit sehr hohem Volumen, das das sagt! – tddmonkey

+5

Es hängt von der Implementierung ab. Zum Beispiel: http://cxf.apache.org/docs/jax-rs-client-api.html#JAX-RSClientAPI-ThreadSafety –

13

Ich bin mir nicht sicher, aber ich denke, das ist eine Implementierung-spezifische Entscheidung.

Ich konnte weder in der JAX-RS 2.0-Spezifikation noch im Javadoc etwas finden, das javax.ws.rs.client.Client thread-sicher ist. Aber in der Resteasy (ein Implementierer von JAX-RS) Dokumentation I:

Eine Standard Entscheidung von Httpclient und verabschiedet von Resteasy ist die Verwendung von org.apache.http.impl.conn.SingleClientConnManager, die verwaltet einen einzelnen Socket zu einem bestimmten Zeitpunkt und unterstützt die Verwendung Fall, in dem ein oder mehrere Aufrufe seriell aus einem einzigen Thread gemacht werden. Für Multi-Thread-Anwendungen, SingleClientConnManager kann durch org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager ersetzt:

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

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

in diesen Informationen Aufgrund denke ich, dass die Antwort Für Ihre Frage ist wahrscheinlich "Nein".

+0

Siehe auch http://stackoverflow.com/questions/22257258/threadsafeclientconnmanager – Renan

+2

Sie können tun jetzt: 'neuer ResteasyClientBuilder(). connectionPoolSize (10) ...' um einen thread-sicheren ResteasyClient zu erstellen – Kutzi

+0

Überprüfen Sie meine Antwort hier http://StackOverflow.com/A/38343094/345718 für eine resteasy Lösung. – Patrick