Apache Camel – Configuration des timeouts HTTP

La mise en œuvre d'une requête HTTP avec Camel est assez simple. Après avoir ajouté le composant camel-http.jar au classpath, la route suivante fait une requête de recherche sur Google.

 from("direct:start"). to("http://www.google.com/search?q=netapsys).to("mock:result"); 

Un simple appel dans un test Camel permet de s'assurer que tout s'exécute comme prévu :

 @Test public void test() throws Exception {     this.template.sendBody("direct:start", null); .../... } 

Le composant s'appuie sur la librairie commons-httpclient-3.x.jar pour l'implémentation. Pour la configuration des temporisations HTTP, un petit tour dans la documentation, montre qu'il existe (au moins) deux solutions :

  • Soit, on passe en paramètre la valeur du délai sur la route. Dans ce cas, la route précédente devient :
 from("direct:start"). to("http://www.google.com/search?q=netapsys&httpClient.soTimeout=5000").to("mock:result"); 
  • Soit, on configure le composant directement en injectant un objet ClientConnectionManager correctement paramétré. Si, comme c'est mon cas, vous utilisez Spring comme registre Camel, il suffit de déclarer un bean correspondant au composant et de le paramétrer. Par analogie avec :
 final MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager(); final HttpConnectionManagerParams params = connectionManager.getParams(); params.setConnectionTimeout(6000); connectionManager.setParams(params); HttpClient client = new HttpClient(connectionManager)); 

Cela revient dans un contexte Spring, aux déclarations :

 <bean id="http.connection.manager.params" 	class="org.apache.commons.httpclient.params.HttpConnectionManagerParams">     <property name="connectionTimeout" value="6000" />     <property name="soTimeout" value="4000" /> </bean> <bean id="http.composant" class="org.apache.camel.component.http.HttpComponent">     <property name="httpConnectionManager"> 	<bean 		class="org.apache.commons.httpclient.MultiThreadedHttpConnectionManager"> 		<property name="params" ref="http.connection.manager.params" /> 	</bean>     </property> </bean> 

Il y a même plus court et surtout plus souple. La configuration précédente présente l'inconvénient de fixer les valeurs de temporisation pour l'ensemble des routes utilisant le composant HTTP. Pour une configuration "par route" à la demande, on peut utiliser le paramétrage par référence. Avec les déclarations Spring suivantes :

 <bean id="clientConnectionManager2" 	class="org.apache.commons.httpclient.MultiThreadedHttpConnectionManager"> 	<property name="params"> 		<bean 			class="org.apache.commons.httpclient.params.HttpConnectionManagerParams"> 			<property name="connectionTimeout" value="5000" /> 			<property name="soTimeout" value="2000" /> 		</bean> 	</property> </bean> <bean id="clientConnectionManager3" 	class="org.apache.commons.httpclient.MultiThreadedHttpConnectionManager"> 	<property name="params"> 		<bean 			class="org.apache.commons.httpclient.params.HttpConnectionManagerParams"> 			<property name="connectionTimeout" value="10000" /> 			<property name="soTimeout" value="12000" /> 		</bean> 	</property> </bean> 

Il suffit de configurer les routes avec la référence du bean souhaité :

 from("direct:start1"). to("http://www.google.com/search?q=netapsys&clientConnectionManager=#clientConnectionManager2").to("mock:result"); from("direct:start2"). to("http://www.google.com/search?q=netapsys&clientConnectionManager=#clientConnectionManager3").to("mock:result"); 

Il existe un composant Camel utilisant la version 4.x d'HttpClient que je n'ai pas encore eu l'occasion d'utiliser. La configuration doit être probablement légèrement différente.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.