Me gustaría establecer los tiempos de espera de conexión para un servicio de descanso utilizado por mi aplicación web. Estoy usando RestTemplate de Spring para hablar con mi servicio. Investigué un poco y encontré y usé el xml a continuación (en mi aplicación xml) que creo que está destinado a establecer el tiempo de espera. Estoy usando Spring 3.0.
También he visto el mismo problema aquí Configuración de tiempo de espera para servicios web de primavera con RestTemplate, pero las soluciones no parecen tan limpias , preferiría establecer los valores de tiempo de espera a través de la configuración de Spring
<bean id="RestOperations" class="org.springframework.web.client.RestTemplate">
<constructor-arg>
<bean class="org.springframework.http.client.CommonsClientHttpRequestFactory">
<property name="readTimeout" value="${restURL.connectionTimeout}" />
</bean>
</constructor-arg>
</bean>
Parece que sea lo que sea que establezca readTimeout, obtengo lo siguiente:
Cable de red desconectado: espera unos 20 segundos e informa la siguiente excepción:
org.springframework.web.client.ResourceAccessExcepción: Error de E / S: No hay ruta al host: conectar; La excepción anidada es java.net.NoRouteToHostException: No hay ruta al host: conectar
Url incorrecta, por lo que 404 devuelto por el servicio de descanso: espera unos 10 segundos e informa la siguiente excepción:
org.springframework.web.client.HttpClientErrorException: 404 no encontrado
Mis requisitos requieren tiempos de espera más cortos, por lo que debo poder cambiarlos. ¿Alguna idea de lo que estoy haciendo mal?
Muchas gracias.
fuente
new
declaración extraña en elSpring Boot
ejemploconnectionRequestTimeout
atributo no está disponible antes del 4.1.4Finalmente conseguí que esto funcionara.
Creo que el hecho de que nuestro proyecto tuviera dos versiones diferentes del jar commons-httpclient no estaba ayudando. Una vez que resolví eso, descubrí que puedes hacer dos cosas ...
En el código puedes poner lo siguiente:
La primera vez que se llama a este código, se establecerá el tiempo de espera para la
HttpComponentsClientHttpRequestFactory
clase utilizada porRestTemplate
. Por lo tanto, todas las llamadas posteriores realizadas porRestTemplate
utilizarán la configuración de tiempo de espera definida anteriormente.O la mejor opción es hacer esto:
Donde uso la
RestOperations
interfaz en mi código y obtengo los valores de tiempo de espera de un archivo de propiedades.fuente
java.lang.ClassCastException: org.springframework.http.client.InterceptingClientHttpRequestFactory cannot be cast to org.springframework.http.client.HttpComponentsClientHttpRequestFactory
Esta pregunta es el primer enlace para una búsqueda de Spring Boot, por lo tanto, sería genial poner aquí la solución recomendada en la documentación oficial . Spring Boot tiene su propio bean RestTemplateBuilder de conveniencia :
La creación manual de instancias de RestTemplate es un enfoque potencialmente problemático porque otros beans configurados automáticamente no se inyectan en instancias creadas manualmente.
fuente
setConnectTimeout
y algunas implementaciones desetReadTimeout
están en desusoAquí están mis 2 centavos. Nada nuevo, pero algunas explicaciones, mejoras y código más nuevo.
De forma predeterminada,
RestTemplate
tiene un tiempo de espera infinito. Hay dos tipos de tiempos de espera: tiempo de espera de conexión y tiempo de espera de lectura. Por ejemplo, podía conectarme al servidor pero no podía leer los datos. La aplicación se colgó y no tienes ni idea de lo que está pasando.Voy a usar anotaciones, que en estos días se prefieren a XML.
Aquí usamos
SimpleClientHttpRequestFactory
para configurar la conexión y leer los tiempos de espera. Luego se pasa al constructor deRestTemplate
.En la segunda solución, usamos
RestTemplateBuilder
. También observe los parámetros de los dos métodos: tomanDuration
. Los métodos sobrecargados que toman directamente milisegundos ahora están en desuso.Edición Probado con Spring Boot 2.1.0 y Java 11.
fuente
Aquí hay una forma realmente sencilla de establecer el tiempo de espera:
fuente
Tuve un escenario similar, pero también tuve que configurar un Proxy. La forma más sencilla que pude ver para hacer esto fue extender el
SimpleClientHttpRequestFactory
para facilitar la configuración del proxy (diferentes proxies para non-prod vs prod). Sin embargo, esto debería funcionar incluso si no necesita el proxy. Luego, en mi clase extendida, anulo elopenConnection(URL url, Proxy proxy)
método, usando lo mismo que la fuente , pero solo estableciendo los tiempos de espera antes de regresar.fuente
Para ampliar la respuesta de benscabbia :
fuente
Anular el tiempo de espera con SimpleClientHttpRequestFactory
HTTPClient proporciona otras funciones útiles como grupo de conexiones, gestión de conexiones inactivas, etc.
Leer más: Ejemplo de configuración Spring RestTemplate + HttpClient
Anular el tiempo de espera con HttpComponentsClientHttpRequestFactory
referencia: Ejemplo de configuración de tiempo de espera de Spring RestTemplate
fuente