How to set connection timeout with OkHttp
As of OkHttp3 you can do this through the Builder like so
client = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.build();
You can also view the recipe here.
For older versions, you simply have to do this
OkHttpClient client = new OkHttpClient();
client.setConnectTimeout(15, TimeUnit.SECONDS); // connect timeout
client.setReadTimeout(15, TimeUnit.SECONDS); // socket timeout
Request request = new Request.Builder().url(url).build();
Response response = client.newCall(request).execute();
Be aware that value set in setReadTimeout
is the one used in setSoTimeout
on the Socket
internally in the OkHttp
Connection
class.
Not setting any timeout on the OkHttpClient
is the equivalent of setting a value of 0
on setConnectTimeout
or setReadTimeout
and will result in no timeout at all. Description can be found here.
As mentioned by @marceloquinta in the comments setWriteTimeout
can also be set.
As of version 2.5.0
read / write / connect timeout values are set to 10 seconds by default as mentioned by @ChristerNordvik. This can be seen here.
How to set connection timeout in okhttp3?
client = new OkHttpClient.Builder().connectTimeout(10, TimeUnit.SECONDS).build()
How to change timeout for a request in okhttp
In 3.9 it is possible to set this per request in an interceptor
https://github.com/square/okhttp/blob/36bd68aa3e93affb12504cd40454e64c6812019c/okhttp-tests/src/test/java/okhttp3/InterceptorTest.java#L747-L757
@Test public void chainWithReadTimeout() throws Exception {
Interceptor interceptor1 = new Interceptor() {
@Override public Response intercept(Chain chainA) throws IOException {
assertEquals(5000, chainA.readTimeoutMillis());
Chain chainB = chainA.withReadTimeout(100, TimeUnit.MILLISECONDS);
assertEquals(100, chainB.readTimeoutMillis());
return chainB.proceed(chainA.request());
}
};
}
How to set a different connection timeout for specific service in OkHttp 3?
All the HTTP client configuration lives in OkHttpClient including proxy settings, timeouts, and caches. When you need to change the configuration of a single call, call OkHttpClient.newBuilder(). This returns a builder that shares the same connection pool, dispatcher, and configuration with the original client.
In example below, we make one request with a 500 ms timeout and another with a 3000 ms timeout.
private final OkHttpClient client = new OkHttpClient();
public void run() throws Exception {
Request request = new Request.Builder()
.url("http://httpbin.org/delay/1") // This URL is served with a 1 second delay.
.build();
// Copy to customize OkHttp for this request.
OkHttpClient client1 = client.newBuilder()
.readTimeout(500, TimeUnit.MILLISECONDS)
.build();
try (Response response = client1.newCall(request).execute()) {
System.out.println("Response 1 succeeded: " + response);
} catch (IOException e) {
System.out.println("Response 1 failed: " + e);
}
// Copy to customize OkHttp for this request.
OkHttpClient client2 = client.newBuilder()
.readTimeout(3000, TimeUnit.MILLISECONDS)
.build();
try (Response response = client2.newCall(request).execute()) {
System.out.println("Response 2 succeeded: " + response);
} catch (IOException e) {
System.out.println("Response 2 failed: " + e);
}
}
So you need to create different client for each request.
okHttp client gives timeout after adding callTimeout() config to it and has moments where the request doesn't reach the host
As after adding the configurations, you are getting this exception, I am suspecting, the requested endpoint needs more time than your configured 5 seconds.
If your requested endpoint is taking more than 5 seconds (5_000 milliseconds) to get a response, you will get a timeout here with this config.
You can use postman to get the response time of your requested endpoint. If it is more than 5 seconds, you can simply configure these values accordingly. Maybe, you can use 30 seconds, instead of 5 Seconds.
I Hope, it helps.
How to fix errors with timeout on okhttp client
Is that you looking for?
OkHttpClient okHttpClient = new OkHttpClient.Builder()
//default timeout for not annotated requests
.readTimeout(10000, TimeUnit.MILLISECONDS)
.connectTimeout(10000, TimeUnit.MILLISECONDS)
.writeTimeout(10000, TimeUnit.MILLISECONDS)
.build();
How can I set connection timeout for OkHttpClient? 2017
If you create your OkHttpClient
through an OkHttpClient.Builder
, there are connectTimeout()
, readTimeout()
, and writeTimeout()
methods that you can call for the various timeout options.
If you need to override them for a specific HTTP request, call newBuilder()
on your OkHttpClient
. That gives you an OkHttpClient.Builder
with the same settings as you used originally. You can override those as needed, and create a temporary OkHttpClient
from the new Builder
, using that for this one-off call.
Related Topics
Why I'm Not Able to Unwrap and Serialize a Java Map Using the Jackson Java Library
How to Upper Case Every First Letter of Word in a String
How to Create New Xml File from Existing Database in Postgresql Database Using Java
Calendar.Month Gives Wrong Output
Javafx Entirely Customized Windows
Performance Difference Between Java 8 Lambdas and Anonymous Inner Classes
How to Find Out If "Debug Mode" Is Enabled
How to Achieve Transfer File Between Client and Server Using Java Socket
Differences Between Just in Time Compilation and on Stack Replacement
Java. Ignore Accents When Comparing Strings
Java.Util.Regex - Importance of Pattern.Compile()