Premiers pas avec Camel et Fuse

Nous allons faire nos premiers pas en développant un bundle OSGi basé sur Spring et Camel sans utiliser Maven (utilisation de ANT). Dans cet exemple, nous allons créer un bundle qui attend une requête GET HTTP, qui trace le contenu dans un fichier et retourne une page Web au navigateur. Il s’agit d’un exemple sans JSP et sans servlet.

1) Environnement

Il vous faudra Eclipse, le SDK Java, Fuse, Camel 2.4 et vos doigts. Dans la console Karaf de Fuse, il faudra installer un composant supplémentaire : camel-jetty. Pour se faire, vous pouvez taper la commande : features:install camel-jetty. En cas de problème du genre :  

URL [mvn:org.apache.camel/camel-http/2.2.0-fuse-02-00] could not be resolved

  Il faudra placer les jars de Camel à la main, ça se fait simplement en créant l’arborescence suivante :  

/opt
-/apache-servicemix
-/system
-/org
-/apache
-/camel
-/camel-http
-/2.2.0-fuse-02-00
-/camel-http-2.2.0-fuse-02-00.jar
-/camel-jetty
-/2.2.0-fuse-02-00
-/camel-jetty-2.2.0-fuse-02-00.jar

 

2) Sous Eclipse

Il va falloir récupérer le jar BND sur aQute. On crée une librairie utilisateur pour Camel :

On crée un nouveau projet java ayant l’arborescence suivante :  

app.env=DEV
serviceMix.deploy=/opt/apache-servicemix/deploy
bnd.path= lib/biz.aQute.bnd.jar
camel.home=/opt/apache-camel/lib

  Puis le build.xml pour ANT :  

  Enfin créer un fichier bnd.bnd à la racine :  

Bundle-SymbolicName: HTTP-Camel-Test
Bundle-Name: HTTP-Camel-Test :: test de Camel-HTTP
Bundle-Version: 1.0

Export-Package: *;-noimport:=true
Import-Package: *

Include-Resource:
-runfw: org.apache.felix.framework

  J’expliquerai comment fonctionne le fichier bnd, mais vous pouvez avoir un avant goût sur aQute.

3) En route pour Camel

Entrons dans le vif du sujet. Commençons par nos classes :

3.1) La route Camel

 

package org.giwi.test.camel.http.routes;

import org.apache.camel.builder.RouteBuilder;
import org.giwi.test.camel.http.processor.MyHTTPProcessor;

public class TestRoute extends RouteBuilder {

/*
* (non-Javadoc)
*
* @see org.apache.camel.builder.RouteBuilder#configure()
*/
@Override
public void configure() throws Exception {
from(“jetty:http://0.0.0.0:8181/httpTest/index.jsp?sessionSupport=true“)
.process(new MyHTTPProcessor())
.to(“file:/home/giwi/temp/?fileName=toto.txt&fileExist=Append”)
.to(“bean:processContent”);
}
}

 

Explication : la requête HTTP sera attrapée par le composant Jetty à partir de l’instruction from, la requête HTTPRequest est passée à un processeur. Puis le résultat du processeur est enregistré dans un fichier (attention, un simple / en début de path indique un path absolu, un double / indique un path relatif. Puis le message continue son chemin vers un bean Java et le résultat de ce bean sera le corps de HTTPResponse.

3.2) Le processeur

 

package org.giwi.test.camel.http.processor;

import javax.servlet.http.HttpServletRequest;

import org.apache.camel.Exchange;
import org.apache.camel.Processor;

public class MyHTTPProcessor implements Processor {

@Override
public void process(final Exchange exchange) throws Exception {
// accès à la requête
final HttpServletRequest req = exchange.getIn().getBody(HttpServletRequest.class);
final String name = req.getParameter(“name”);
exchange.getOut().setBody(name);
}
}

 

3.3) Le bean Java

 

package org.giwi.test.camel.http.generator;

public class Generator {

public String generate(final String value) {
return “Hello “ + value + “”;
}
}

 

3.4) Le Contexte Camel

Il s’agit de la subtilité du bouzin. il faut créer un fichier /resources/META-INT/spring/camel-context.xml.

Dans ce fichier, nous déclarons la route et le bean.

4) Déploiement et test

Il faut lancer la tâche ANT all pour que le bundle se compile, se package en jar et se dépose dans /opt/apache-servicemix/deploy. Si Fuse est démarré, le bundle se déploie automatiquement. Pour le tester, il suffit d’utiliser l’url : http://localhost:8181/httpTest/index.jsp?name=toto.

Normalement, vous devriez voir “Hello toto” dans votre navigateur et le fichier /home/giwi/temp/toto.txt doit contenir la chaîne “toto”.

5) Pour aller plus loin

Commentaires