2016-09-22 4 views
2

Ich habe zwei einfache Camel-Routen arbeiten zum Schreiben in eine JMS-Warteschlange und Lesen von ihm. Ich stelle ein serialisiertes Objekt in die Warteschlange. Ich bin in der Lage, es zu deserialisieren und zu json erfolgreich zu verdecken.Kamel-Routing basierend auf Objektwert

Weg zum Schreiben:

from("direct:message").to("jms:myqueu") 

Mein Weg zum Lesen:

from("jms:myqueu") 
.marshal() 
.json(JsonLibrary.Gson). 
.to("file://cc") 

Jetzt möchte ich ein Feld innerhalb des Objekts und Route auf dieser Grundlage prüfen. Auch dieses Feld sollte nicht Teil des endgültigen JSON sein.

Kann ich den Wert innerhalb des Objekts und Route basierend darauf überprüfen (wie in andere Dateien schreiben?). Ich kann die Anmerkung im Pojo hinzufügen, um das Feld in der endgültigen JSON zu vermeiden

Ich dachte über das Konvertieren von Objekt in JSON, und dann an die Warteschlange zu senden. Dann kann ich jsonpath für bedingtes Routing verwenden. Aber wie kann ich ein Feld aus dem letzten JSON weglassen?

Antwort

1

Ja, Sie können das inhaltsbasierte Routing verwenden, um ein beliebiges Feld in einem eingehenden Objekt zu überprüfen und das darauf basierende Routing durchzuführen.

ref: - Jackson Anmerkung http://camel.apache.org/content-based-router.html

Um ein Feld während json Rangier zu ignorieren, können Sie @JsonIgnore verwenden.

+0

Danke. Genau das hatte ich vor. Aber ich bin verwirrt, wie man das Feld vom Objekt auswählt. Camel deserialisiert das Objekt und dann habe ich die json-Konvertierung hinzugefügt. Also muss ich das Feld zwischen ihnen überprüfen. Muss ich einen benutzerdefinierten Bean-Filter schreiben und ihn aufrufen? –

+0

Keine Notwendigkeit. Sie können die einfache Methode camel verwenden, um die Getter-Methode Ihrer Bean aufzurufen. Beispiel: $ {body.getSomething} == 'XXXX'. Verwenden Sie diese in Kamel "When" -Klausel. –

+0

In Java DSL, einfach ("$ {body.getSomething} == 'XXXX'") –

0

Als Referenz konnte ich es zum Laufen bringen. Ich habe eine benutzerdefinierte Filterklasse hinzugefügt und den darin enthaltenen Bean-Wert überprüft. Außerdem wurde es innerhalb der Choose-Option für das Routing verknüpft. Mein Weg ist jetzt:

from("jms:myqueu") 
    .choice() 
     .when() 
      .method(Exp.class,"checkfieldA") 
      .json(JsonLibrary.Gson). 
      .to("file://cc") 
     .when() 
      .method(Exp.class,"checkfieldB") 
      .json(JsonLibrary.Gson). 
      .to("file://dd") 
    .endChoice() 

Hier Exp ist eine normale Klasse und checkfieldA und checkfieldB gibt zwei Methoden, Boolesche Werte zurück.

class Exp{ 

    public boolean checkfieldA(Message message){ 
     myobj obj = (myobj)message.getBody() // this is the object is put to queue. Need to cast to my object type . 
     if(myobj.isFieldA()){ 
      return true; 
      } 
     } 

    } 
+0

FYI, in der kommenden Kamel 2.18 können Sie lambdas nutzen, so dass Sie etwas tun können: when(). Body (MyType.class, b -> b.isFeldA()) –

Verwandte Themen