Montag, 15 September 2008

Camel-Routen visualisieren

« SOAP Service Testing | Main | OSGI Embedded Container »

1. Neuesten Stand der Camel-Sourcen holen und bauen

Wir werden jetzt kleinere Features von Camel benutzen, die es im Release 1.4.0 noch nicht gibt (z.B. den Ablageort des Camel-Contextes zu konfigurieren). Deshalb ist es Zeit, die Camel-Sourcen auszuchecken und die aktuelle Version selbst zu bauen:

svn co https://svn.apache.org/repos/asf/activemq/camel/trunk camel
set MAVEN_OPTS=-Xmx512m -XX:MaxPermSize=128m
mvn install -Dtest=false

(vgl. http://activemq.apache.org/camel/building.html)

Das dauert eine Weile. In der Zwischenzeit können wir unser Projekt anpassen.

2. POM anpassen

Zunächst zentralisieren wir die Camel-Versionsangabe an einer Stelle, damit wir bei der nächsten Versionsänderung nur diese anpassen müssen. Dazu fügen wir der POM auf Hauptebene diesen Eintrag hinzu:

property.xml

   1:<properties>
   2:        <camel.version>1.5-SNAPSHOT</camel.version>
   3:</properties>

Nun können wir alle Vorkommen der Camel-Versionsnummer durch eine Referenz auf diese Property (${camel.version}) ersetzen, im vi z.B. mittels
%s,1.4.0,${camel.version},g

Wir ergänzen folgende Dependency, damit das Maven Camel-Plugin den Spring-Kontext laden kann:

dependency.xml

   1:<dependency>
   2:        <groupId>org.apache.camel</groupId>
   3:        <artifactId>camel-spring</artifactId>
   4:        <version>${camel.version}</version>
   5:</dependency>
   6:

In den <build><plugins>-Abschnitt fügen wir diese Konfiguration ein:

plugin-eintrag-build.xml

   1:<plugin>
   2:        <groupId>org.apache.camel</groupId>
   3:        <artifactId>camel-maven-plugin</artifactId>
   4:        <version>${camel.version}</version>
   5:        <configuration>
   6:                <fileApplicationContextUri>src/main/webapp/WEB-INF/spring-context.xml</fileApplicationContextUri>
   7:        </configuration>
   8:</plugin>
   9:

Der Parameter <fileApplicationContextUri> ist einer der Gründe, warum Camel 1.5 benötigt wird (dieser Code wurde von den Camel-Entwicklern am 1. September 2008 eingebaut).

Außerdem fügen wir einen Reporting-Abschnitt ein:

plugin-eintrag-reporting.xml

   1:<reporting>
   2:        <plugins>
   3:                <plugin>
   4:                        <groupId>org.apache.camel</groupId>
   5:                        <artifactId>camel-maven-plugin</artifactId>
   6:                        <version>${camel.version}</version>
   7:                </plugin>
   8:        </plugins>
   9:</reporting>
  10:

Damit sind die Vorbereitungen abgeschlossen und wir können die Visualisierung der Route erstellen.

3. Visualisierung der Route mit GraphViz

Sobald Maven mit dem Kompilieren und Installieren von Camel 1.5-SNAPSHOT fertig ist, können wir mit mvn camel:dot eine graphische Repräsentation der Route erstellen. Dazu muss dot auf dem Rechner installiert sein (Doku dazu findet sich unter http://activemq.apache.org/camel/camel-maven-plugin.html und http://activemq.apache.org/camel/visualisation.html). Die graphische Darstellung der Route wird nach target/site/cameldoc generiert und sieht zunächst so aus:

Das ist weder sehr schön noch besonders praktikabel; aber da Camel GraphViz benutzt, kann man die Routen mit relativ wenig Aufwand nachbearbeiten. Die Datei target/site/cameldoc/routes.dot sieht etwa so aus:

routes.dot

   1:digraph CamelRoutes {
   2:
   3:node [style = "rounded,filled", fillcolor = yellow, fontname="Helvetica-Oblique"];
   4:
   5:subgraph cluster_0 {
   6:label = "Camel Routes";
   7:color = grey;
   8:style = "dashed";
   9:URL = "Camel Routes.html";
  10:
  11:
  12:node1 [
  13:label = "cxf:bean:helloEndpoint"
  14:tooltip = "cxf:bean:helloEndpoint"
  15:URL = "http://activemq.apache.org/camel/message-endpoint.html"
  16:];
  17:
  18:
  19:node2 [
  20:label = "Interceptor Ref"
  21:tooltip = "Interceptor Ref: Delegate(DeadLetterChannel[Delegate(TraceInterceptor[To[bean:myCamelProcessor]]), RecipientList[log:org.apache.camel.DeadLetterChannel?level=error], RedeliveryPolicy[maximumRedeliveries=5, initialRedeliveryDelay=1000, maximumRedeliveryDelay=60000, useExponentialBackOff=false, backOffMultiplier=2.0, useCollisionAvoidance=false, collisionAvoidanceFactor=0.15]])"
  22:URL = "http://activemq.apache.org/camel/interceptor-ref.html"
  23:shape = "box"
  24:];
  25:
  26:node1 -> node2 [
  27:];
  28:
  29:node3 [
  30:label = "bean:myCamelProcessor"
  31:tooltip = "bean:myCamelProcessor"
  32:URL = "http://activemq.apache.org/camel/message-endpoint.html"
  33:];
  34:
  35:node2 -> node3 [
  36:label = "Delegate(DeadLetterChannel[Delegate(TraceInterceptor[To[bean:myCamelProcessor]]), RecipientList[log:org.apache.camel.DeadLetterChannel?level=error], RedeliveryPolicy[maximumRedeliveries=5, initialRedeliveryDelay=1000, maximumRedeliveryDelay=60000, useExponentialBackOff=false, backOffMultiplier=2.0, useCollisionAvoidance=false, collisionAvoidanceFactor=0.15]])"
  37:];
  38:
  39:}
  40:
  41:}

Die Labels sind etwas geschwätzig; das läßt sich jedoch leicht ändern, indem man den Text großzügig kürzt. Außerdem kann man von http://activemq.apache.org/camel/images/eip/ die passenden Bildchen herunterladen und mit image = "<Pfad im Dateisystem> in die Grafik einarbeiten (GraphViz kann leider aktuell nicht mit HTTP-URLs umgehen). Die resultierende Datei sieht z.B. so aus:

routes.dot

   1:digraph CamelRoutes {
   2:
   3:node [fontname="Helvetica-Oblique", fontsize="10", fontcolor="red"];
   4:
   5:subgraph cluster_0 {
   6:label = "Camel Routes";
   7:color = grey;
   8:style = "dashed";
   9:URL = "Camel Routes.html";
  10:
  11:
  12:node1 [
  13:label = "cxf:bean:helloEndpoint"
  14:labelloc = "t"
  15:tooltip = "cxf:bean:helloEndpoint"
  16:URL = "http://activemq.apache.org/camel/message-endpoint.html"
  17:shape = "box"
  18:image = "images/MessageEndpointIcon.png"
  19:];
  20:
  21:
  22:node2 [
  23:label = "Interceptor Ref"
  24:tooltip = "TraceInterceptor"
  25:URL = "http://activemq.apache.org/camel/interceptor-ref.html"
  26:shape = "box"
  27:image = "images/WireTapIcon.png"
  28:];
  29:
  30:node1 -> node2 [
  31:label = "Logging"
  32:];
  33:
  34:node3 [
  35:label = "bean:myCamelProcessor"
  36:tooltip = "bean:myCamelProcessor"
  37:URL = "http://activemq.apache.org/camel/message-endpoint.html"
  38:shape = "box"
  39:image = "images/MessageTranslatorIcon.png"
  40:];
  41:
  42:node2 -> node3 [
  43:];
  44:
  45:}
  46:
  47:}

Und das Bildchen, das dabei herauskommt, kann sich schon eher sehen lassen.

Technorati Tags:

Posted by gisbert.amm at 9:16 PM in SOA

 

[Trackback URL for this entry]

Trackback: hype.yeebase.com at Do, 18 Sep 7:41 AM

Camel-Routen visualisieren
ESB's dienen der Integration unterschiedlicher Systeme eines Unternehmens. Mit Hilfe von Spring (ein Dependency Injection Framework) und Camel (Routingengine für den elektronischen Nachrichtenaustausch und die Transformation von Nachrichten). Dabei wer...

Your comment:

(not displayed)
 
 
 

Live Comment Preview:

 
« September »
MoDiMiDoFrSaSo
1234567
891011121314
15161718192021
22232425262728
2930