Я использую org.springframework.http.client.HttpComponentsClientHttpRequestFactory в своем коде и хочу использовать Reflection (org.springframework.util.ReflectionUtils) для получения некоторых значений времени ожидания, таких как ConnectTimeout, из этого объекта. Я не очень понимаю, как получить это поле из этого объекта.
Я пробовал что-то вроде: ReflectionUtils.findField(httpComponentsClientHttpRequestFactory.getClass(), "connectTimeout");
Но значение возвращается как null.




Значения времени ожидания являются частью поля RequestConfig HttpComponentsClientHttpRequestFactory. Ниже приведен код для доступа к тому же.
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
factory.setConnectTimeout(1000);
Field requestConfigField = ReflectionUtils.findField(
HttpComponentsClientHttpRequestFactory.class, "requestConfig", RequestConfig.class);
requestConfigField.setAccessible(true);
RequestConfig requestConfig = (RequestConfig) ReflectionUtils.getField(requestConfigField, factory);
System.out.println("Connect timeoout = " + requestConfig.getConnectTimeout());
(обратите внимание, что это значение по умолчанию, и нам никогда не приходилось устанавливать значение тайм-аута на заводе перед его получением). Принимая во внимание, что с httpComponentsClientHttpRequestFactory, если мы сначала не установим значение тайм-аута, мы получим RequestConfig как null. Так есть ли разница между SimpleFactory и httpComponents...Factory в том, что у первого есть тайм-ауты по умолчанию, а у второго нет?
Если вы не вызовете factory.setConnectTimeout() или аналогичные методы, объект RequestConfig не будет создан. RequestConfig является частью HTTP-компонентов Apache, а не частью Spring. Объект RequestConfig в конечном итоге передается http-клиенту apache. Если он равен нулю, будут использоваться значения по умолчанию, указанные в классе RequestConfig. Проверьте исходный код класса RequestConfig на наличие значений по умолчанию.
this.staleConnectionCheckEnabled = false; this.redirectsEnabled = истина; это.maxRedirects = 50; this.relativeRedirectsAllowed = true; this.authenticationEnabled = истина; this.connectionRequestTimeout = -1; this.connectTimeout = -1; this.socketTimeout = -1; this.contentCompressionEnabled = истина; ......................... По умолчанию connectTimeout равен -1, что означает, что он ждет вечно.
При использовании SimpleHttpRequestFactory используются средства HTTP по умолчанию (URLConnection) JDK — docs.oracle.com/javase/tutorial/networking/urls/…
У объекта типа HttpComponentsClientHttpRequestFactory нет значений по умолчанию для этих тайм-аутов? Я считаю, что
SimpleClientHttpRequestFactoryДЕЙСТВИТЕЛЬНО имеет значение тайм-аута по умолчанию -1, потому что, если вы это сделаетеField field = ReflectionUtils.findField(simpleClientHttpRequestFactory.getClass(), "connectTimeout", int.class); SimpleClientHttpRequestFactory simpleClientHttpRequestFactory = new SimpleClientHttpRequestFactory(); ReflectionUtils.makeAccessible(field); int v = (Integer)ReflectionUtils.getField(field, simpleClientHttpRequestFactory); v prints as -1