Получить значения времени ожидания из HttpComponentsClientHttpRequestFactory с помощью spring ReflectionUtils

Я использую org.springframework.http.client.HttpComponentsClientHttpRequestFactory в своем коде и хочу использовать Reflection (org.springframework.util.ReflectionUtils) для получения некоторых значений времени ожидания, таких как ConnectTimeout, из этого объекта. Я не очень понимаю, как получить это поле из этого объекта.

Я пробовал что-то вроде: ReflectionUtils.findField(httpComponentsClientHttpRequestFactory.getClass(), "connectTimeout");

Но значение возвращается как null.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
129
1

Ответы 1

Значения времени ожидания являются частью поля 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 нет значений по умолчанию для этих тайм-аутов? Я считаю, что SimpleClientHttpRequestFactory ДЕЙСТВИТЕЛЬНО имеет значение тайм-аута по умолчанию -1, потому что, если вы это сделаете Field field = ReflectionUtils.findField(simpleClientHttpRequestFactory.get‌​Class(), "connectTimeout", int.class); SimpleClientHttpRequestFactory simpleClientHttpRequestFactory = new SimpleClientHttpRequestFactory(); ReflectionUtils.makeAccessible(field); int v = (Integer)ReflectionUtils.getField(field, simpleClientHttpRequestFactory); v prints as -1

user1892775 17.03.2019 17:38

(обратите внимание, что это значение по умолчанию, и нам никогда не приходилось устанавливать значение тайм-аута на заводе перед его получением). Принимая во внимание, что с httpComponentsClientHttpRequestFactory, если мы сначала не установим значение тайм-аута, мы получим RequestConfig как null. Так есть ли разница между SimpleFactory и httpComponents...Factory в том, что у первого есть тайм-ауты по умолчанию, а у второго нет?

user1892775 17.03.2019 17:39

Если вы не вызовете factory.setConnectTimeout() или аналогичные методы, объект RequestConfig не будет создан. RequestConfig является частью HTTP-компонентов Apache, а не частью Spring. Объект RequestConfig в конечном итоге передается http-клиенту apache. Если он равен нулю, будут использоваться значения по умолчанию, указанные в классе RequestConfig. Проверьте исходный код класса RequestConfig на наличие значений по умолчанию.

Ranjith 24.03.2019 06:20

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, что означает, что он ждет вечно.

Ranjith 24.03.2019 06:20

При использовании SimpleHttpRequestFactory используются средства HTTP по умолчанию (URLConnection) JDK — docs.oracle.com/javase/tutorial/networking/urls/…

Ranjith 24.03.2019 06:23

Другие вопросы по теме