2013-09-30 7 views
6

1. Frage:Camel - Inhalt enricher: anreichern() vs pollEnrich()

Ich bin wirklich nicht in der Lage, den Unterschied zwischen enrich() und pollEnrich() zu verstehen. Vielleicht sind die Begriffe, die Camel benutzt, nicht so toll.

Ich lese hier: http://camel.apache.org/content-enricher.html

Inhalt Anreicherung mit dem Anreicherungs-DSL Element

Kamel mit zwei Arten von Inhalten enricher

  • bereichern
  • pollEnrich im DSL kommt

Anreicher verwendet einen Producer, um die zusätzlichen Daten zu erhalten. Es wird normalerweise für Request-Reply-Messaging verwendet, um beispielsweise einen externen Web-Service aufzurufen. pollEnrich verwendet dagegen einen Polling-Consumer, um die zusätzlichen Daten zu zu erhalten. Es wird normalerweise für die Nachrichtenmeldung verwendet, um beispielsweise eine Datei zu lesen oder eine FTP-Datei herunterzuladen.

Ich verstehe nicht, was der Unterschied ist. Beide scheinen die zusätzlichen Daten (Web-Service-Antwort, FTP-Datei) zu erhalten, indem sie sie verbrauchen. Warum sagen sie also, dass die Antwort des Web-Service von einem "Produzenten" stammt?

2. Frage:

In der "Camel in Aktion" Buch p. 72 sagen sie:

Enrich und pollEnrich keine Informationen in dem aktuellen Wechsel

Weder bereichern noch pollEnrich keine Informationen nutzen können aus dem aktuellen Wechsel zugreifen können. Das bedeutet zum Beispiel, dass Sie nicht einen Dateinamen Header auf der Börse für pollEnrich zu wählen Sie eine bestimmte Datei speichern können. Dies kann sich in Zukunft ändern, wenn das Team von Camel eine Lösung finden kann.

jedoch sie ein Codebeispiel ähnlich die folgenden geben, eine Aggregationsstrategie für die Umsetzung:

public class ExampleAggregationStrategy implements AggregationStrategy { 

    public Exchange aggregate(Exchange original, Exchange resource) { 
     Object originalBody = original.getIn().getBody(); 
     Object resourceResponse = resource.getIn().getBody(); 
     Object mergeResult = ... // combine original body and resource response 
     if (original.getPattern().isOutCapable()) { 
      original.getOut().setBody(mergeResult); 
     } else { 
      original.getIn().setBody(mergeResult); 
     } 
     return original; 
    } 

} 

In diesem Beispiel ich, dass sie Zugang sehen müssen die Exchange original, ist es nicht der „aktuelle Wechsel "? Wenn nicht, welchen Austausch stellt dann der "ursprüngliche Austausch" dar? Und was meinen sie mit dem "aktuellen Austausch"? Hier

Antwort

12

ist der Unterschied:

  • enrich vorausgesetzt, dass Sie einen eingehenden Exchange als Parameter an eine andere Dienstanforderung verwendet werden soll.Ihr eingehender Exchange könnte z. B. eine Benutzer-ID sein, aber Sie benötigen wirklich das gesamte Benutzerobjekt, also könnten Sie enrich, indem Sie die Benutzer-ID an einen REST-Dienst übergeben, der das Benutzerobjekt zurückgibt, das zum Exchange usw. wird.

  • pollEnrich nimmt an, dass der eingehende Exchange ein einfacher Auslöser ist, der einen PollingConsumer anweist, nach Daten zu suchen und einen Exchange zu erstellen (wobei der Inhalt des eingehenden Exchange ignoriert wird). Sie könnten beispielsweise einen Timer oder ein anderes Geschäftsprozessereignis haben, bei dem eine Datei zur Verarbeitung abgerufen werden muss usw. Die eingehenden Exchange-Daten werden NICHT zur dynamischen Konfiguration des PollingConsumer verwendet ... nur der URI wird dafür verwendet.

Das heißt, wie von Camel 2,12, gibt es eine Möglichkeit ist, eine Aggregationsstrategie festlegen, die eingehenden/zurückgegeben Börsen für beide enrich und pollEnrich

Siehe this unit test ein Beispiel für pollEnrich mit einer Aggregation zu kombinieren Strategie