ein Kamel im Frühling : Camel mit Spring


Quelle : http://www.springsource.com

Beim letzten Mal hab ich die SNMP-Nachrichten per Java-Camel-DSL via JMS-Zwischenstopp in der ActiveMQ-Queue in die MySQL-Datenbank schreiben lassen. Camel kann aber neben der hübschen Domain Specific Language auch noch die Möglichkeit, Routen über Spring zu konfigurieren. Dafür wird in erster Linie die Spring-Config-Datei „camel-config.xml“ benötigt:





	
               
	
	
	
		
		
		
  		
	
	
	

	
	
		
			
			
				//entry[oid='1.3.6.1.2.1.1.3.0']/value/text()
			
			
		
		
		
			
			
			
		
		
	


Um aus dem JMS-Content einen ansehnlichen SQL-Insert-String zu machen, wird ein Prozessor-Bean (OrderToSqlBean) verwendet:

package eu.christophburmeister.camel.snmprouter.core;

import org.apache.camel.language.XPath;

public class OrderToSqlBean {
    public String toSql(
            @XPath("//entry[oid='1.3.6.1.2.1.1.3.0']/value/text()") String corId,
            @XPath("//entry[oid='1.3.6.1.4.1.42.1.1']/value/text()") String msg) {
    	
        StringBuilder sb = new StringBuilder();
        sb.append("insert into snmp_traps ");
        sb.append("values (");
        sb.append("'").append(corId).append("', ");
        sb.append("'").append(msg).append("') ");
        return sb.toString();
    }
}

Mit ein bisschen XPath-Magie holen wir die CorrelationId (corId) sowie einen extrem wichtigen Wert (1.3.6.1.4.1.42.1.1) aus dem JMS-Body und fügen diesen ganz einfach als klassisches Insert-Statement in die referenzierte MySQL-DB ein.

Gestartet wird die Applikation jetzt über eine simple main-Methode als Spring-Thread mit folgendem Inhalt :

package eu.christophburmeister.camel.snmprouter.core;

import org.apache.camel.spring.Main;

public class Start {
    public static void main(String[] args) throws Exception {
        new Main().run(args);
    }
}

Das gesamte Projekt sieht dann so aus :

mit der pom.xml


	4.0.0
	eu.christophburmeister.camel
	snmprouter
	0.0.1-SNAPSHOT
	jar

	
		2.5.0
	

	
		
		
			org.snmp4j
			snmp4j
			1.10.1
		
		
			org.apache.camel
			camel-core
			${camel.version}
		
		
			org.apache.camel
			camel-snmp
			${camel.version}
		
		
			org.apache.camel
			camel-jms
			${camel.version}
		
		
			org.apache.camel
			camel-jdbc
			${camel.version}
		
		
			org.apache.activemq
			activemq-camel
			5.2.0
		
		
			commons-logging
			commons-logging
			1.1.1
		
		
			log4j
			log4j
			1.2.14
		
		
			org.springframework
			spring-jdbc
			1.2.6
		
		
			mysql
			mysql-connector-java
			5.1.6
		
		
			commons-pool
			commons-pool
			20030825.183949
		
		
			commons-collections
			commons-collections
			20040616
		
	

	
		snmpReceiver
		
			
				org.apache.maven.plugins
				maven-compiler-plugin
				
					1.6
					1.6
				
			
			
				org.apache.maven.plugins
				maven-assembly-plugin
				
					
						jar-with-dependencies
					
					
						
							
							eu.christophburmeister.camel.snmprouter.core.Start
						
					
				
				
					
						make-assembly
						
						package
						
							single
						
					
				
			
			
				maven-clean-plugin
				2.4.1
				
					
						auto-clean
						initialize
						
							clean
						
					
				
			
		
	


und der log4j.properties

log4j.rootLogger=DEBUG, file, console

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d [%t] %-5p %c - %m%n

log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=d:/camel.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d [%t] %-5p %c - %m%n

Und nicht so schöne Fehlermeldungen wie „java.lang.NoClassDefFoundError: org/apache/commons/pool/ObjectPoolFactory“ oder „java.lang.NoClassDefFoundError: org/apache/commons/collections/CursorableLinkedList“ können einfach mit folgenden Maven-Dependencies abgewendet werden:

   
        commons-pool
        commons-pool
        ${so.ne.version.halt}
   
   
        commons-collections
        commons-collections
        ${so.ne.version.halt}