Tag : spring

Par Fabian Piau, le 14 octobre 2011

[JUG] Java EE & CDI vs. Spring

Mercredi soir au JUG nantais, nous avons pu assister à la présentation "Stateful is beautiful" d'Antoine Sabot-Durand.

Expert en Java EE depuis plusieurs années, Antoine nous a donné sa vision sur le paysage Java actuel, en particulier sur Java EE (Enterprise Edition) et l'alternative Spring.

Lire la suite
Par Vincent Durand, le 02 février 2011

RESTer simple avec Spring et JAXB - Partie 1 : Binding avec JAXB

Beaucoup de tutoriaux s'arrête à l'approche serveur de l'utilisation de REST. Le but de cette série de posts est d'écrire une application web utilisant le style d'architecture REST et de fournir une API cliente permettant d'utiliser les services offerts par le serveur.

Cette première partie a pour objectif de générer la représentation XML du modèle métier de l'exemple. Dans un second billet, l'approche serveur sera abordée. Le projet se terminera par l'écriture de la partie cliente de l'application.

Lire la suite
Par Jean-Baptiste Defard, le 18 janvier 2011

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.