Как установить соединение и считать тайм-аут с Jersey 2.x?
В Джерси 1 у нас была функция setConnectTimeout в классе com.sun.jersey.api.client.Client
,
В майке 2 javax.ws.rs.client.Client
класс используется там, где эта функция отсутствует.
Как установить тайм-аут соединения и тайм-аут чтения в Джерси 2.x?
2 ответа
Решение
Код ниже работает для меня в Джерси 2.3.1 (вдохновение можно найти здесь: /questions/16487194/javaxwsrsclientclient-kak-nastroit-readtimeout/16487201#16487201)
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();
}
}
Вы также можете указать время ожидания для каждого запроса:
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();
}
}
Начиная с jersey 2.26 (который использует JAX-RS 2.1) для этого есть новые методы:
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();