2016-04-24 2 views
0

Ich versuche, mehr über Apache Camel zu lernen. Ich fand die Dokumentation etwas hilfreich, lässt aber viele Einsteiger, die nicht wissen, wie kleine Codesegmente leicht in voll funktionsfähige Programme passen sollten. Hoffentlich wissen die meisten Leute, was ich versuche zu beschreiben. Ich bin viele Male in einigen Programmierbüchern verloren gegangen, in denen Codeabschnitte außerhalb des Kontexts eines vollständig laufenden Programms angezeigt werden.Aggregationsprogramm

Wie auch immer, hier ist mein Programm, das Nachrichten aus irgendeinem Grund nicht aggregiert. Ich hatte gehofft, dass es alle meine Nachrichten sammeln würde, aber dieses Programm macht das nicht. Beim Ausführen des Programms erhalte ich eine leere Datei als Ausgabe, die nicht mein Ziel ist.

package laser.helmet.camel.friend; 

import org.apache.camel.builder.RouteBuilder; 

public class AggregatingMessagesRoute extends RouteBuilder { 

    @Override 
    public void configure() throws Exception { 

     from("direct:start") 
       .aggregate().constant(true) 
       .completionTimeout(100L) 
       .groupExchanges() 
       .to("file:target/this_folder/result?allowNullBody=true"); 
    } 

} 

Dann rufe ich dieses Programm aus der unteren Klasse, die die main Methode natürlich hat.

package laser.helmet.camel.friend; 

import org.apache.camel.CamelContext; 
import org.apache.camel.impl.DefaultCamelContext; 
import org.apache.camel.ProducerTemplate; 

public class Main { 

    public static void main(String[] args) throws Exception { 
     CamelContext c = new DefaultCamelContext(); 
     c.addRoutes(new AggregatingMessagesRoute()); 
     ProducerTemplate pt = c.createProducerTemplate(); 

     c.start(); 

     pt.sendBody("direct:start", "1"); 
     pt.sendBody("direct:start", "2"); 
     Thread.sleep(5000); 
     c.stop(); 
    } 

} 

Ich habe erwartet, den Körper der beiden Botschaften, die ich mit den ProducerTemplate erstellen sowohl nach der Route endet in der Datei zu sein, aber es ist nur eine leere Datei. Ich musste den Teil allowNullBody=true zu der Route hinzufügen, weil der Körper aus irgendeinem Grund null ist, wenn dieses Programm ausgeführt wird.

Auch wenn Sie ein Anfänger sind und sich wundern. Ich bringe die Abhängigkeiten mit Maven ein, anstatt die camel.jars auf meinen Java Klassenpfad zu setzen.

Vielen Dank für das Lesen dieser alle. : D

Also, wie kann ich anfangen, Nachrichten Stackoverflow aggregieren? 0_o

Frieden,

user_loser

+0

Wenn Sie abgestimmt haben, geben Sie bitte Gründe an. Ein verklemmter Snob zu sein, ist kein guter Grund. Vielen Dank für Ihre Aufmerksamkeit auf diesen kleinen Kommentar. :) –

+1

Ich habe es gewählt, um es für dich auszugleichen, es ist eine sehr gute Frage und ich wette, es wird vielen Menschen in der Zukunft helfen. –

Antwort

2

Dies ist leicht gefallen, da Sie den Code-Schnipsel zur Verfügung gestellt, nice one! Entfernen Sie .groupExchanges(), da es veraltet ist und es kaum ausreicht. Sie benötigen immer eine AggregationStrategy, um fein abgestimmte Kontrolle darüber zu haben, wie Sie Ihre Börsen aggregieren. Fügen Sie also die folgende Klasse hinzu:

class StringAggregationStrategy implements AggregationStrategy { 

    public Exchange aggregate(Exchange oldExchange, Exchange newExchange) { 
     if (oldExchange == null) { 
      return newExchange; 
     } 

     String oldBody = oldExchange.getIn().getBody(String.class); 
     String newBody = newExchange.getIn().getBody(String.class); 
     oldExchange.getIn().setBody(oldBody + "+" + newBody); 
     return oldExchange; 
    } 
} 

Und dann verweisen Sie es in Ihrer Route; So wird es in etwa so:

public class AggregatingMessagesRoute extends RouteBuilder { 

    @Override 
    public void configure() throws Exception { 

     from("direct:start") 
       .aggregate().constant(true) 
       .completionTimeout(100L) 
       .aggregationStrategy(new StringAggregationStrategy()) 
       .to("file:target/this_folder/result?allowNullBody=true"); 
    } 

} 

Hoffe, das hilft!

R.

+0

Ehrfürchtig. Das funktioniert tatsächlich. Es kann hilfreich sein, die Importanweisungen in Ihrem Quellcode anzugeben. Ich weiß das, aber jemand, der noch närrischer ist als ich, ist vielleicht so verwirrt, dass sie in einem Akt der Nerd-Wut von einem Gebäude springen. Danke Ramin für die schnelle Hilfe des Experten. : D :) –

+0

Ich bin sehr froh das hat dir geholfen! –