wake-up-neo.com

Festlegen des Anforderungszeitlimits für die JAX-RS 2.0-Client-API

Ich habe eine einfache REST - Webdienstclientklasse geschrieben, die die JAX-RS 2.0-Client-API verwendet, um REST -Anfragen zu stellen. Ich versuche herauszufinden, wie ein Anforderungszeitlimit für jeden Aufruf festgelegt wird. Hier ist der Code für eine Anfrage:

Client client = ClientBuilder.newBuilder().build();
WebTarget resourceTarget = client.target(restServiceUrl)
        .path("{regsysID}/{appointmentID}/")
        .resolveTemplate("regsysID", regSysId)
        .resolveTemplate("appointmentID", apptId);

Invocation invocation = resourceTarget.request(MediaType.APPLICATION_JSON).buildPut(null);
String createSessionJson = invocation.invoke(String.class);
20
sarabdeep singh

Sie können dies tun, indem Sie zuerst eine ClientConfig erstellen und diese beim Erstellen des neuen Clients als Argument angeben.

import org.glassfish.jersey.client.ClientProperties;

ClientConfig configuration = new ClientConfig();
configuration.property(ClientProperties.CONNECT_TIMEOUT, 1000);
configuration.property(ClientProperties.READ_TIMEOUT, 1000);
Client client = ClientBuilder.newClient(configuration);
13
Jeroen

Mit Resteasy kann dies erreicht werden, indem Sie Ihren Client als solchen erstellen.

Client client = new ResteasyClientBuilder()
    .establishConnectionTimeout(2, TimeUnit.SECONDS)
    .socketTimeout(2, TimeUnit.SECONDS)
    .build();

Ich habe keine Liste von Standardkonfigurationseigenschaften gesehen, die Sie über ClientBuilder.newClient(Configuration configuration) festlegen könnten, um diese portabel zu machen.

10
codylerum

Hinweis: Dies ist eine neue Methode für JAX-RS 2.1.

Dies ist ein sehr alter Beitrag, aber der unten stehende Code funktioniert sowohl für Trikots als auch für Erholung.

ClientBuilder clientBuilder = ClientBuilder.newBuilder();
clientBuilder.connectTimeout(10, TimeUnit.SECONDS);
clientBuilder.readTimeout(12, TimeUnit.SECONDS);
Client client = clientBuilder.build();
10
Pravat

Zuerst müssen Sie relevante Abhängigkeiten hinzufügen (hier für WildFly 10.1):

<dependency>
    <groupId>org.Apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-client</artifactId>
    <version>3.0.14.Final</version>
    <scope>provided</scope>
</dependency>

Erstellen Sie anschließend einen normalen Apache HttpClient, und drücken Sie RestEasy Enginge, wobei Sie eine Methode überschreiben. Dies verursacht das Problem:

// create here a normal Apache HttpClient with all parameters, that you need
HttpClient httpClient = createHttpClient(connectTimeout,
                                         socketTimeout,
                                         connectionRequestTimeout,
                                         maxTotalHTTPConnections);
// Deprecated Apache classes cleanup https://issues.jboss.org/browse/RESTEASY-1357
// Client Framework not honoring connection timeouts Apache Client 4.3 https://issues.jboss.org/browse/RESTEASY-975
ApacheHttpClient4Engine engine = new ApacheHttpClient4Engine(httpClient) {
        @Override
        protected void loadHttpMethod(ClientInvocation request, HttpRequestBase httpMethod) throws Exception {
            super.loadHttpMethod(request, httpMethod);
            httpMethod.setParams(new BasicHttpParams());
        }
    };

return new ResteasyClientBuilder().httpEngine(engine).build();

Schauen Sie sich an https://issues.jboss.org/browse/RESTEASY-975 Scheint, dass das Problem gerade in der Version 3.1.0.Final behoben wurde. 

4
Maxim Karavaev

Wenn Sie Jersey 2.x verwenden, ist dies die einfache Lösung, die für mich funktioniert

import com.jclient.JClient;

Client c = Client.create();
WebResource webResource = c.resource("requestUrl");
c.setConnectTimeout(yourMins*60*1000);
0
Nagaraju Beesu

Für Personen, die an der älteren JAX-RS 2.0-API und der alten Resteasy-Implementierung hängen bleiben, können Sie diese Methode verwenden:

Client client = new ResteasyClientBuilder()             
     .establishConnectionTimeout(3, TimeUnit.SECONDS)
     .socketTimeout(5, TimeUnit.SECONDS).build();

Trotz des Namens steht socketTimeout für "Read Timeout", da es bei den Dokumenten für "Timeout für das Warten auf Daten" steht.

0
dliber