Nous allons voir ensemble comment intégrer le framework Camel au sein d'une application utilisant Maven et Spring. Puis, nous créerons une route qui prendra un message en entrée, le modifiera via un processeur Camel, et l'enverra sur une queue ActiveMQ. C'est parti !
Versions utilisées
Voici les versions utilisées dans ce tutorial
Camel 2.7.0
Spring 3.0.5.RELEASE
Maven 3.0.2
Intégration du framework
Tout d'abord, il vous faut ajouter dans le pom.xml de votre application les dépendances suivantes :
<!-- 1) Dépendances Camel --> <!-- Core du framework --> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-core</artifactId> </dependency> <!-- Spring support --> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-spring</artifactId> </dependency> <!-- JMS support --> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-jms</artifactId> </dependency> <!-- Fin dépendances Camel --> <!-- 2) Autres dépendances --> <!-- Composant Camel ActiveMQ externe --> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-camel</artifactId> </dependency> <!-- JMS --> <dependency> <groupId>javax.jms</groupId> <artifactId>jms</artifactId> </dependency> <!-- Spring JMS --> <dependency> <groupId>org.springframework</groupId> <artifactId>org.springframework.jms</artifactId> </dependency> <!-- Fin autres dépendances -->
Déclaration du contexte Camel et du producer template
Déclarer dans la configuration Spring de votre projet :
<!-- Camel producer template --> <bean id="camelProducerTemplate" class="org.apache.camel.spring.CamelProducerTemplateFactoryBean"> <property name="camelContext" ref="camelContext" /> </bean> <!-- Camel context --> <bean id="camelContext" class="org.apache.camel.spring.CamelContextFactoryBean"> <property name="id" value="camel-test-context"/> <property name="builderRefs"> <list> <ref bean="camelTest.routeBuilder.routeDefinition"/> </list> </property> </bean>
NB : la propriété builderRefs référence les RouteBuilderDefinition qui seront chargées dans le contexte Camel.
Création de la route
Les RouteBuilderDefinition référencent les RouteBuilder qui permettent eux d'instancier les routes lors du démarrage du contexte Camel. Ainsi, pour créer une route, il faut étendre la classe RouteBuilder et redéfinir la méthode configure().
Dans notre exemple, nous allons créer une route qui pourra être appelée directement via une des méthodes send() du producer template. Elle appellera un processeur qui mettra le body du message en upper case et l'enverra sur une queue JMS ActiveMQ. Voici la configuration Spring nécessaire :
<!-- RouteBuilderDefinition --> <bean id="camelTest.routeBuilder.routeDefinition" class="org.apache.camel.model.RouteBuilderDefinition"> <property name="ref" value="camelTest.routeBuilder"/> </bean> <!-- RouteBuilder --> <bean id="camelTest.routeBuilder" class="com.netapsys.camel.test.route.CamelTestRouteBuilder"> <property name="camelTestQueue" value="camel.test.queue"/> </bean>
Et la classe CamelTestRouteBuilder :
Création du processeur
Un processeur doit implémenter l'interface org.apache.camel.Processor et redéfinir la méthode process(Exchange) :
Il faut ensuite le déclarer dans le contexte Spring :
<!-- Camel processors --> <bean id="camelTest.messageConverter.processor" class="com.indom.camel.test.processor.MessageConverterProcessor"/> <!-- End Camel processors -->
Notons ici que l'id du bean est celui utilisé à la ligne 46 de notre RouteBuilder.
Création du composant ActiveMQ
Elle se fait par configuration uniquement (l'id du composant est celui utilisé à la ligne 49 du RouteBuilder) :
<!-- Composant Camel ActiveMQ --> <bean id="activemq.camelTest.component" class="org.apache.activemq.camel.component.ActiveMQComponent"> <property name="configuration" ref="camelTest.jms.configuration"/> </bean> <!-- Configuration JMS --> <bean id="camelTest.jms.configuration" class="org.apache.camel.component.jms.JmsConfiguration"> <property name="connectionFactory" ref="camelTest.jms.factory"/> </bean> <!-- Connections Factory --> <bean id="camelTest.jms.factory" destroy-method="stop" class="org.apache.activemq.pool.PooledConnectionFactory"> <property name="connectionFactory"> <bean class="org.apache.activemq.ActiveMQConnectionFactory"> <property name="brokerURL"> <value>tcp://192.10.10.10:61616</value> </property> <property name="userName" value="username"/> <property name="password" value="password"/> </bean> </property> </bean>
Et voilà!
Il ne nous reste plus qu'à appeler notre route de la manière suivante :
Le message reçu dans la queue camel.test.queue est bien celui attendu :
TOP ! Merci Hubert et merci Netapsys !
Oui, à refaire ! Nous avons passé un moment vraiment agréable.