2012-06-08 5 views
10

Die DirectComponent documentation gibt folgendes Beispiel:Was ist der Unterschied zwischen "direct:" und to() in Apache Camel?

from("activemq:queue:order.in") 
    .to("bean:orderServer?method=validate") 
    .to("direct:processOrder"); 

from("direct:processOrder") 
    .to("bean:orderService?method=process") 
    .to("activemq:queue:order.out"); 

Gibt es einen Unterschied zwischen diesem und dem folgenden?

from("activemq:queue:order.in") 
    .to("bean:orderServer?method=validate") 
    .to("bean:orderService?method=process") 
    .to("activemq:queue:order.out"); 

Ich habe versucht, Dokumentation zu finden, was das Verhalten der zu() Methode ist auf dem Java-DSL, sondern über die RouteDefinition javadoc (die die sehr schroff gibt „Sende den Austausch mit dem gegebenen Endpunkt“) ich habe kommen leer :(

Antwort

13

In dem sehr obigen Fall werden Sie nicht viel Unterschied. die „direkte“ Komponente wie ein Methodenaufruf ist.

Sobald Sie beginnen ein wenig komplexe Routen bauen Sie möchten sie aus verschiedenen Gründen in mehrere Teile segmentieren:

Sie können beispielsweise "Unterrouten" erstellen, die in Ihrem Kamel-Kontext auf mehrere Routen wiederverwendet werden können. Ähnlich wie Sie Methoden in regulärer Programmierung ausgliedern, um Wiederverwendbarkeit zu ermöglichen und Code klarer zu machen. Dasselbe gilt für Unterstrecken, die beispielsweise die direkte Komponente verwenden.

Derselbe Ansatz kann erweitert werden. Angenommen, Sie möchten mehrere Protokolle als Endpunkte für Ihre Route verwenden. Sie können den direkten Endpunkt verwenden, um die Hauptroute, um so etwas zu schaffen:

// Three endpoints to one "main" route. 
from("activemq:queue:order.in") 
    .to("direct:processOrder"); 

from("file:some/file/path") 
    .to("direct:processOrder"); 

from("jetty:http://0.0.0.0/order/in") 
    .to("direct:processOrder"); 

from("direct:processOrder") 
    .to("bean:orderService?method=process") 
    .to("activemq:queue:order.out"); 

Eine andere Sache ist, dass eine Route für jeden geschaffen wird „aus()“ Klausel in DSL. Eine Route ist ein Artefakt in Camel, und Sie können bestimmte Verwaltungsaufgaben mit der Camel API ausführen, z. B. Routen dynamisch starten, stoppen, hinzufügen oder entfernen. Die "to" -Klausel ist nur ein Endpunkt-Aufruf.

Sobald Sie beginnen, einige echte Fälle mit etwas Komplexität in Camel zu tun, werden Sie feststellen, dass Sie nicht zu viele "direkte" Routen bekommen können.

+0

OK. Ich verstehe, dass es ein Punkt der Wiederverwendbarkeit/Identität ist; Gibt es keinen Verhaltensunterschied? – bacar

+0

'Die "to" -Klausel ist nur ein Endpunkt-Call.' - Was genau bedeutet das? Es klingt ein wenig vage. – bacar

+0

Die To-Klausel wird genau das tun, was Sie in Ihrer Frage gesagt haben. Senden Sie den Austausch an einen Endpunkt einer Komponente, wobei der Austausch der Nachrichtenumschlag ist und der Endpunkt eine bestimmte Konfiguration einer Komponente ist. Das Verhalten von to() hängt stark von der Komponente ab (http: // http: //camel.apache.org/components). –

2

Direct Component wird verwendet, um das logische Segment der Route zu benennen. Dies ist ein ähnlicher Prozess wie das Benennen von Prozeduren in struktureller Programmierung.

In Ihrem Beispiel gibt es keinen Unterschied im Nachrichtenfluss. In Bezug auf die strukturelle Programmierung könnten wir sagen, dass Sie eine Art inline expansion zu Ihrer Route machen.

+0

Gibt es ähnliche Beispiele, wo es einen Unterschied gibt? – bacar

+0

Grundsätzlich ist das der Unterschied :). Direct == Logischer Name –

+0

Ich meinte in dem beobachteten Verhalten. Es klingt wie ein Nein. – bacar

0
from(A).to(B).to(OUT) 

ist Verkettungs

A --- B --- OUT 

Aber

from(A).to(X) 
from(B).to(X) 
     from(X).to(OUT) 

wobei X eine direkte :? ist

ist im Grunde wie ein beitreten

A 
    \____ OUT 
/
B 

offensichtlich diese unterschiedlichen Verhaltensweisen sind, und mit dem zweiten können Sie implementieren Anylogic Sie wollten, nicht nur eine serielle Kette

+0

Wie würde man eine Route mit von (direkt) starten ... und dann eine Datei lesen? – MRK187

+0

von (Datei) .to (direkt) Ihre Fragen ein wenig mehrdeutig, so bin ich approximieren, was ich denke, Sie meinen. Wenn Sie genauer wiederholen, kann ich Ihnen genauer sagen Wenn Sie wie ein Trigger bedeuten, versuchen Sie "pollenrich()" - ich nicht dünn Kit dokumentiert sehr gut, aber es ist wie ein Trigger von (direkt: A) .pollenrich (B) –

1

Ein weiterer Unterschied ist Direkt Komponente nicht hat einen Thread-Pool, die direkte Consumer-Methode wird vom aufrufenden Thread des direkten Produzenten aufgerufen.

0

Hauptsächlich verwendet, um die komplexe Routenkonfiguration wie in Java zu brechen, benutzten wir Methode für die Wiederverwendbarkeit. Und indem wir Threads auf direktem Weg konfigurieren, können wir die Arbeit für den Aufruf von Threads reduzieren.

Verwandte Themen