HTTP-Post-Requests mit Camel in JMS-Queue schreiben


Quelle : http://deviantart.net by ~webblaster48

Camel ist auf den ersten Blick ganz nett und ohne tieferes Wissen gut und schnell einsetzbar, aber sobald man mal nicht mit hübschen UDP-Messages ohne Response-Notwendigkeit arbeiten muss/kann, sollte man sich schon die Welt der Message Exchange Pattern anschauen. Camel bietet hierfür zwei Basis-Modelle, Request Reply und Event Message.

“ […] if a message exchange is a one way Event Message (InOnly) or a Request Reply message exchange (InOut).“ – Apache Camel

Als Training habe ich HTTP-Requests (die ja synchron sind) via Camel in eine ActiveMQ-Queue geschrieben. Einen entsprechenden Testclient habe ich hier schon gebaut, oder man macht das ganze per HTML-Formular:

   

die camel-context.xml sieht dann so aus:





	
	
		
	

	
	

	
	

		
			
			
			
                        
			
			
                        
                              
			           
                                   ${in.header.validationResult} == 'valid'
                                   
                                   
				   
		                   
		                          valid input
		                   
                              
                              
			           
                                   ${in.header.validationResult} == 'invalid'
                                   
                                   
				   
                                   
                                          invalid input
                                   
                              
                            
		
	

Wenn ich jetzt einen POST-Request mit den Parametern „brightside=anakin“ und „darkside=vader“ gegen den Jetty-Endpoint schieße, läuft die Message über den Validator, der die Parameter aus dem Exchange (Header-attribute) ausliest und dementsprechend ein „ValidationResult“ in den Exchange schreibt :

import org.apache.camel.Exchange;

public class ValidatorBean {
    public String validate(Exchange exchange){
        String validation = "";

        String brightside = exchange.getIn().getHeader("#brightside").toString();
        String darkside = exchange.getIn().getHeader("#darkside").toString();
        if ( (brightside.equals("anakin")) && (darkside.equals("vader")) ){
            exchange.getOut().setHeader("validationResult", "valid");
        } 
        else {
            exchange.getOut().setHeader("validationResult", "invalid");
        }
        
        return validation;
    }
}

Die einzige Logik steckt also im Validator-Bean. Das anschließende Message-Filtering oder Content-Filtering bedient sich lediglich der simple-language, um das result aus dem Exchange auszulesen. Der Rest ist wieder einfach, denn je nach Result wird die Message in eine entsprechende Queue kopiert und anschließend transformiert und zurückgegeben. Die Besonderheit beim JMS-Endpoint ist, dass dieser kein ReplyTo enthalten soll : „Like InOnly the producer will not wait for a reply. A consumer with this flag will behave like InOnly.“