Gostaria de definir o tempo limite da conexão para um serviço de descanso usado pelo meu aplicativo da web. Estou usando o RestTemplate do Spring para conversar com meu serviço. Eu fiz algumas pesquisas e encontrei e usei o xml abaixo (no meu aplicativo xml), que acredito que deve definir o tempo limite. Estou usando o Spring 3.0.
Também vi o mesmo problema aqui Configuração de tempo limite para serviços da web do Spring com RestTemplate, mas as soluções não parecem tão limpas , eu prefiro definir os valores de tempo limite via Spring config
<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, independentemente do que eu defina como readTimeout, recebo o seguinte:
Cabo de rede desconectado: aguarda cerca de 20 segundos e relata a seguinte exceção:
org.springframework.web.client.ResourceAccessException: Erro de E / S: Nenhuma rota para o host: conectar; exceção aninhada é java.net.NoRouteToHostException: nenhuma rota para o host: conectar
URL incorreto, para 404 retornado pelo serviço de repouso: Aguarda cerca de 10 segundos e relata a seguinte exceção:
org.springframework.web.client.HttpClientErrorException: 404 não encontrado
Meus requisitos exigem tempos limite mais curtos, portanto, preciso alterá-los. Alguma idéia do que estou fazendo de errado?
Muito Obrigado.
fonte
new
afirmações ímpares noSpring Boot
exemploconnectionRequestTimeout
atributo não está disponível antes da versão 4.1.4Eu finalmente consegui isso funcionando.
Acho que o fato de nosso projeto ter duas versões diferentes do jar commons-httpclient não estava ajudando. Depois que resolvi isso, descobri que você pode fazer duas coisas ...
No código, você pode colocar o seguinte:
A primeira vez que esse código é chamado, ele definirá o tempo limite da
HttpComponentsClientHttpRequestFactory
classe usada peloRestTemplate
. Portanto, todas as chamadas subsequentes feitas porRestTemplate
usarão as configurações de tempo limite definidas acima.Ou a melhor opção é fazer isso:
Onde eu uso a
RestOperations
interface no meu código e obtenho os valores de tempo limite de um arquivo de propriedades.fonte
java.lang.ClassCastException: org.springframework.http.client.InterceptingClientHttpRequestFactory cannot be cast to org.springframework.http.client.HttpComponentsClientHttpRequestFactory
Esta questão é o primeiro link para uma pesquisa Spring Boot, portanto, seria ótimo colocar aqui a solução recomendada na documentação oficial . O Spring Boot possui seu próprio bean de conveniência RestTemplateBuilder :
A criação manual de instâncias RestTemplate é uma abordagem potencialmente problemática, porque outros beans configurados automaticamente não estão sendo injetados em instâncias criadas manualmente.
fonte
setConnectTimeout
e algumas implementações desetReadTimeout
estão obsoletasAqui estão os meus 2 centavos. Nada de novo, mas algumas explicações, melhorias e código mais recente.
Por padrão,
RestTemplate
tem tempo limite infinito. Existem dois tipos de tempos limite: tempo limite da conexão e tempo limite da leitura. Por exemplo, eu poderia me conectar ao servidor, mas não consegui ler os dados. O aplicativo estava suspenso e você não tem idéia do que está acontecendo.Vou usar anotações, que hoje são preferidas ao XML.
Aqui usamos
SimpleClientHttpRequestFactory
para definir a conexão e ler tempos limite. É então passado para o construtor deRestTemplate
.Na segunda solução, usamos o
RestTemplateBuilder
. Observe também os parâmetros dos dois métodos: eles aceitamDuration
. Os métodos sobrecarregados que levam diretamente milissegundos agora estão obsoletos.Editar testado com Spring Boot 2.1.0 e Java 11.
fonte
Aqui está uma maneira realmente simples de definir o tempo limite:
fonte
Eu tive um cenário semelhante, mas também foi necessário definir um proxy. A maneira mais simples de ver isso foi estendendo a
SimpleClientHttpRequestFactory
facilidade de configuração do proxy (proxies diferentes para não-prod vs prod). Isso ainda deve funcionar, mesmo se você não precisar do proxy. Então, na minha classe estendida, substituo oopenConnection(URL url, Proxy proxy)
método, usando o mesmo da fonte , mas apenas definindo os tempos limite antes de retornar.fonte
Para expandir a resposta de benscabbia :
fonte
Substituir tempo limite com SimpleClientHttpRequestFactory
O HTTPClient fornece outros recursos úteis, como pool de conexões, gerenciamento de conexões inativas etc.
Leia mais: Exemplo de configuração Spring RestTemplate + HttpClient
Substituir tempo limite com HttpComponentsClientHttpRequestFactory
Referência: Exemplo de Configuração de Tempo Limite do Spring RestTemplate
fonte