Je souhaite définir les délais de connexion pour un service de repos utilisé par mon application Web. J'utilise RestTemplate de Spring pour parler à mon service. J'ai fait quelques recherches et j'ai trouvé et utilisé le xml ci-dessous (dans mon application xml) qui, je pense, est destiné à définir le délai d'expiration. J'utilise Spring 3.0.
J'ai également vu le même problème ici Configuration du délai d'expiration pour les services Web de printemps avec RestTemplate, mais les solutions ne semblent pas aussi claires , je préférerais définir les valeurs de délai d'expiration 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>
Il semble que tout ce que j'ai défini pour readTimeout, j'obtiens ce qui suit:
Câble réseau déconnecté: attend environ 20 secondes et signale l'exception suivante:
org.springframework.web.client.ResourceAccessExcep tion: erreur d'E / S: aucune route vers l'hôte: connexion; l'exception imbriquée est java.net.NoRouteToHostException: Aucune route vers l'hôte: connect
URL incorrecte donc 404 renvoyée par le service de repos: attend environ 10 secondes et signale l'exception suivante:
org.springframework.web.client.HttpClientErrorException: 404 introuvable
Mes exigences nécessitent des délais d'expiration plus courts, je dois donc pouvoir les modifier. Des idées sur ce que je fais mal?
Merci beaucoup.
la source
new
déclaration étrange dans l'Spring Boot
exempleconnectionRequestTimeout
attribut n'est pas disponible avant la version 4.1.4.RELEASEJ'ai finalement réussi à faire fonctionner ça.
Je pense que le fait que notre projet ait eu deux versions différentes du jar commons-httpclient n'aidait pas. Une fois que j'ai réglé cela, j'ai découvert que vous pouviez faire deux choses ...
Dans le code, vous pouvez mettre ce qui suit:
La première fois que ce code est appelé, il définira le délai d'expiration de la
HttpComponentsClientHttpRequestFactory
classe utilisée par leRestTemplate
. Par conséquent, tous les appels ultérieurs effectués parRestTemplate
utiliseront les paramètres de délai d'expiration définis ci-dessus.Ou la meilleure option est de faire ceci:
Où j'utilise l'
RestOperations
interface dans mon code et récupère les valeurs de délai d'expiration à partir d'un fichier de propriétés.la source
java.lang.ClassCastException: org.springframework.http.client.InterceptingClientHttpRequestFactory cannot be cast to org.springframework.http.client.HttpComponentsClientHttpRequestFactory
Cette question est le premier lien pour une recherche Spring Boot, ce serait donc bien de mettre ici la solution recommandée dans la documentation officielle . Spring Boot a son propre bean pratique RestTemplateBuilder :
La création manuelle d'instances RestTemplate est une approche potentiellement gênante car d'autres beans configurés automatiquement ne sont pas injectés dans des instances créées manuellement.
la source
setConnectTimeout
et certaines implémentations desetReadTimeout
sont obsolètesVoici mes 2 cents. Rien de nouveau, mais quelques explications, améliorations et code plus récent.
Par défaut,
RestTemplate
a un délai d'expiration infini. Il existe deux types de délais d'expiration: le délai de connexion et le délai de lecture. Par exemple, je pourrais me connecter au serveur mais je ne pouvais pas lire les données. L'application était suspendue et vous n'avez aucune idée de ce qui se passe.Je vais utiliser des annotations, qui de nos jours sont préférées à XML.
Ici, nous utilisons
SimpleClientHttpRequestFactory
pour définir la connexion et lire les délais d'attente. Il est ensuite transmis au constructeur deRestTemplate
.Dans la deuxième solution, nous utilisons le
RestTemplateBuilder
. Notez également les paramètres des deux méthodes: ils prennentDuration
. Les méthodes surchargées qui prennent directement des millisecondes sont désormais obsolètes.Edit Testé avec Spring Boot 2.1.0 et Java 11.
la source
Voici un moyen très simple de définir le délai d'expiration:
la source
J'ai eu un scénario similaire, mais je devais également définir un proxy. La façon la plus simple que j'ai pu voir pour faire cela était d'étendre le
SimpleClientHttpRequestFactory
pour la facilité de configuration du proxy (différents proxys pour non-prod vs prod). Cela devrait toujours fonctionner même si vous n'avez pas besoin du proxy. Ensuite, dans ma classe étendue, je remplace laopenConnection(URL url, Proxy proxy)
méthode, en utilisant la même chose que la source , mais en définissant simplement les délais d'attente avant de revenir.la source
Pour développer la réponse de benscabbia :
la source
Remplacer le délai d'expiration avec SimpleClientHttpRequestFactory
HTTPClient fournit d'autres fonctionnalités utiles telles que le pool de connexions, la gestion des connexions inactives, etc.
Lire la suite: Exemple de configuration Spring RestTemplate + HttpClient
Remplacer le délai d'expiration avec HttpComponentsClientHttpRequestFactory
reference: Exemple de configuration du délai d'expiration Spring RestTemplate
la source