2012-04-11 5 views
1

Ich habe zwei verschiedene Dienste auf einem Webserver ausgeführt. Beide Dienste haben eine Operation namens 'xyz' mit den folgenden Argumenten.So ermitteln Sie den Typ des Camel Exchange-Objekts

Service 1:

Public String xyx(Student object) {}

Service 2:

public String xyz(Employee object){}

Jetzt habe ich einen Client, der den Betrieb einer dieser Dienste auf der Grundlage der Meldung aufrufen wird, die es empfängt . Die Nachricht wird als Kamelaustausch empfangen. Also muss ich den Typ der Nachricht identifizieren und dann den entsprechenden Dienst aufrufen.

Wie identifiziere ich den ursprünglichen Typ der Nachricht, die als Kamel Austausch empfangen wird.

Danke.

+0

Nur ein Gedanke durch, warum nicht die Header in die Log-Komponente Dump, die gedruckt werden sie zum Terminal. Vielleicht gibt es etwas in den Kopfzeilen, mit dem Sie herausfinden können, wie Sie diese unterscheiden können. – Namphibian

Antwort

6

Ich würde den Wert in der Kopfzeile festlegen, um anzuzeigen, welcher Dienst es ist, und dann auf der Kamelroute senden. Dieser Ansatz ist nur eine Möglichkeit, dies zu tun. Christian Schneider hat eine weitere ausgezeichnete Lösung, die ich wahrscheinlich jetzt viel mehr nutzen werde, da ich seitdem viel mehr in Camel habe. Aber beide werden das gleiche erreichen und abhängig davon, wen Sie fragen, könnte einer klarer sein als der andere.

Zum Beispiel können Sie tun:

public void foo(Exchange exchange){ 

exchange.getIn().setHeader("MsgType", "Student"); 

} 

Sie dann auf dem Kopf entweder in der Java DSL oder sogar Frühling DSL filtern.

In Java DSL Sie so etwas wie diese (Pseudocode)

from("foo:incommingroute") 
.choice() 
.when(header("MsgType").equals("Student")) 
    .to("webservice:Student") 
.when(header("MsgType").equals("Employee")) 
    .to("webservice:Employee") 
.otherwise() 
    .to("jms:Deadletter") 
.end(); 

Im Frühjahr DSL tun würde, würden Sie so etwas wie dieses (Pseudo-Code) tun

<route> 
<from uri="foo:incommingroute"/> 
    <choice> 
    <when> 
     <simple>${header.MsgType} equals 'Student'</simple> 
     <to uri="webservice:Student"/> 
    </when> 
    <when> 
     <simple>${header.MsgType} equals 'Employee'</simple> 
     <to uri="webservice:Employee"/> 
    </when> 
    <otherwise> 
     <to uri="jms:badOrders"/> 
    <stop/> 
</otherwise> 
</choice> 
<to uri="jms:Deadletter"/> 
</route> 

Sie auch bei der Suche können Anreicherungsmuster bei diesem Link http://camel.apache.org/content-enricher.html. Grundsätzlich folge ich dem Anreicherungsmuster. Wenn Sie mir sagen könnten, wie Sie Nachrichten an Camel senden, könnte ich wahrscheinlich mehr helfen.

Hope this Ihnen ein paar Ideen, und wenn es Syntaxfehler ist usw. im Code leid, dass ich an einer Bushaltestelle am und nicht die Zeit, es zu überprüfen habe. .

5

Versuchen exchange.getIn() getBody() instanceof Studenten

+0

Kurz und süß. Ich mag das. – Namphibian

2

Oder Sie können so etwas tun:

from("foo:incommingroute") 
    .choice() 
     .when(simple("${body} is 'java.lang.String'")) 
      .to("webservice:Student") 
     .when(simple("${body} is 'foo.bar.Employee'")) 
      .to("webservice:Employee") 
     .otherwise() 
      .to("jms:Deadletter") 
     .end(); 
Verwandte Themen