How to set the connection and read timeout with Jersey 2.x?
Asked Answered
D

3

60

In jersey 1 we had a function setConnectTimeout in the class com.sun.jersey.api.client.Client.

In jersey 2 the javax.ws.rs.client.Client class is used where this function is missing.

How to set connection timeout and read timeout in jersey 2.x?

Deus answered 23/10, 2013 at 13:36 Comment(0)
B
80

The code below works for me in Jersey 2.3.1 (inspiration found here: https://mcmap.net/q/330407/-javax-ws-rs-client-client-how-to-configure-readtimeout)

public static void main(String[] args) {
    Client client = ClientBuilder.newClient();

    client.property(ClientProperties.CONNECT_TIMEOUT, 1000);
    client.property(ClientProperties.READ_TIMEOUT,    1000);

    WebTarget target = client.target("http://1.2.3.4:8080");

    try {
        String responseMsg = target.path("application.wadl").request().get(String.class);
        System.out.println("responseMsg: " + responseMsg);
    } catch (ProcessingException pe) {
        pe.printStackTrace();
    }
}
Baziotes answered 24/10, 2013 at 9:17 Comment(4)
I doubt that this works. .property(...) returns a client instance (builder pattern). The settings will not be used when you invoke the .target().Alonzoaloof
Actually it works. The builder pattern does not say another instance should be created. Just look at the source code, the return value is the actual client (just to make easier for us to do subsequent calls).Smug
just wanted to know What will happen if the timeout happens, Will we receive gateway timeout (504) or will it throw an exception?Invalidate
@HardikPatel If the connect attempt times out it will throw an exception. 'Gateway timeout 504' comes from the gateway, over the connection, so it can only happen if the connect succeeded.Dormancy
A
41

You may also specify a timeout per request :

public static void main(String[] args) {
    Client client = ClientBuilder.newClient();
    WebTarget target = client.target("http://1.2.3.4:8080");

    // default timeout value for all requests
    client.property(ClientProperties.CONNECT_TIMEOUT, 1000);
    client.property(ClientProperties.READ_TIMEOUT,    1000);

    try {
        Invocation.Builder request = target.request();

        // overriden timeout value for this request
        request.property(ClientProperties.CONNECT_TIMEOUT, 500);
        request.property(ClientProperties.READ_TIMEOUT, 500);

        String responseMsg = request.get(String.class);
        System.out.println("responseMsg: " + responseMsg);
    } catch (ProcessingException pe) {
        pe.printStackTrace();
    }
}
Askins answered 17/3, 2016 at 9:28 Comment(1)
Im not sure, but I think you will need to reassign the client back to itself like this: client = client.property(...), because the property method returns updated configurable instance. Same with the request.Somber
T
3

Starting from jersey 2.26 (which uses JAX-RS 2.1) there are new methods for that:

ClientBuilder builder = ClientBuilder.newBuilder()
        .connectTimeout(5000, TimeUnit.MILLISECONDS)
        .readTimeout(5000, TimeUnit.MILLISECONDS);
        //some more calls if necesary, e.g.
        //.register(LoggingFilter.class);
            
        Client restClient = builder.build();
Transpire answered 21/8, 2020 at 9:39 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.