Einführung in Apache Camel

1. Übersicht

In diesem Artikel stellen wir Camel vor und untersuchen eines seiner Kernkonzepte - das Nachrichtenrouting .

Wir werden zunächst diese grundlegenden Konzepte und Begriffe behandeln und dann zwei Hauptoptionen für die Definition von Routen vorstellen - Java DSL und Spring DSL.

Wir werden dies auch anhand eines Beispiels demonstrieren - indem wir eine Route definieren, die Dateien aus einem Ordner verbraucht und in einen anderen verschiebt, während jedem Dateinamen ein Zeitstempel vorangestellt wird.

2. Über Apache Camel

Apache Camel ist ein Open Source-Integrationsframework, das die Integration von Systemen einfach und unkompliziert macht.

Endbenutzer können verschiedene Systeme mit derselben API integrieren. Dies unterstützt mehrere Protokolle und Datentypen, ist erweiterbar und ermöglicht die Einführung benutzerdefinierter Protokolle.

3. Maven-Abhängigkeiten

Um Camel verwenden zu können, müssen wir zuerst die Maven-Abhängigkeit hinzufügen:

 org.apache.camel camel-core 2.18.0 

Die neueste Version des Kamelartefakts finden Sie hier.

3. Domain-spezifische Sprache

Routen und Routing-Engine sind der zentrale Teil von Camel. Routen enthalten den Ablauf und die Logik der Integration zwischen verschiedenen Systemen.

Um Routen einfacher und sauberer zu definieren, bietet Camel verschiedene domänenspezifische Sprachen (DSL) für Programmiersprachen wie Java oder Groovy an. Andererseits werden auch Routen in XML mit Spring DSL definiert.

Die Verwendung von Java DSL oder Spring DSL wird meistens vom Benutzer bevorzugt, da die meisten Funktionen in beiden verfügbar sind.

Java DSL bietet etwas mehr Funktionen, die in Spring DSL nicht unterstützt werden. Spring DSL ist jedoch manchmal vorteilhafter, da XML geändert werden kann, ohne dass der Code neu kompiliert werden muss.

4. Terminologie und Architektur

Lassen Sie uns nun die grundlegende Terminologie und Architektur von Camel diskutieren.

Zunächst werfen wir hier einen Blick auf die Kernkonzepte von Camel:

  • Die Nachricht enthält Daten, die auf eine Route übertragen werden. Jede Nachricht hat eine eindeutige Kennung und besteht aus einem Text, Überschriften und Anhängen
  • Exchange ist der Container einer Nachricht und wird erstellt, wenn eine Nachricht während des Routing-Prozesses von einem Verbraucher empfangen wird. Exchange ermöglicht verschiedene Arten der Interaktion zwischen Systemen - es kann eine Einwegnachricht oder eine Anforderungs-Antwort-Nachricht definieren
  • Endpunkt ist ein Kanal, über den das System eine Nachricht empfangen oder senden kann. Es kann sich auf einen Webdienst-URI, einen Warteschlangen-URI, eine Datei, eine E-Mail-Adresse usw. Verweisen
  • Die Komponente fungiert als Endpoint Factory. Vereinfacht ausgedrückt bieten Komponenten eine Schnittstelle zu verschiedenen Technologien mit demselben Ansatz und derselben Syntax. Camel unterstützt bereits viele Komponenten in seinen DSLs für fast jede mögliche Technologie, bietet aber auch die Möglichkeit, benutzerdefinierte Komponenten zu schreiben
  • Der Prozessor ist eine einfache Java-Schnittstelle, mit der einer Route eine benutzerdefinierte Integrationslogik hinzugefügt wird. Es enthält eine einzelne Prozessmethode , mit der eine benutzerdefinierte Geschäftslogik für eine von einem Verbraucher empfangene Nachricht erstellt wird

Auf hohem Niveau ist die Architektur von Camel einfach. CamelContext stellt das Camel-Laufzeitsystem dar und verkabelt verschiedene Konzepte wie Routen, Komponenten oder Endpunkte.

Darüber hinaus übernehmen Prozessoren das Routing und die Transformationen zwischen Endpunkten, während Endpunkte verschiedene Systeme integrieren.

5. Eine Route definieren

Routen können mit Java DSL oder Spring DSL definiert werden.

Wir werden beide Stile veranschaulichen, indem wir eine Route definieren, die Dateien aus einem Ordner verbraucht und in einen anderen Ordner verschiebt, während jedem Dateinamen ein Zeitstempel vorangestellt wird.

5.1. Routing mit Java DSL

Um eine Route mit Java DSL zu definieren, müssen Sie zuerst eine DefaultCamelContext- Instanz erstellen . Danach müssen wir die RouteBuilder- Klasse erweitern und die Konfigurationsmethode implementieren , die den Routenfluss enthält:

private static final long DURATION_MILIS = 10000; private static final String SOURCE_FOLDER = "src/test/source-folder"; private static final String DESTINATION_FOLDER = "src/test/destination-folder"; @Test public void moveFolderContentJavaDSLTest() throws Exception { CamelContext camelContext = new DefaultCamelContext(); camelContext.addRoutes(new RouteBuilder() { @Override public void configure() throws Exception { from("file://" + SOURCE_FOLDER + "?delete=true").process( new FileProcessor()).to("file://" + DESTINATION_FOLDER); } }); camelContext.start(); Thread.sleep(DURATION_MILIS); camelContext.stop(); }

Die configure- Methode kann folgendermaßen gelesen werden: Dateien aus dem Quellordner lesen, mit FileProcessor verarbeiten und das Ergebnis an einen Zielordner senden. Wenn Sie delete = true setzen , wird die Datei nach erfolgreicher Verarbeitung aus dem Quellordner gelöscht.

Um Camel zu beginnen, müssen wir rufen Startmethode auf CamelContext . Thread.sleep wird aufgerufen, um Camel die Zeit zu geben, die erforderlich ist, um die Dateien von einem Ordner in einen anderen zu verschieben.

FileProcessor implementiert die Prozessorschnittstelle und enthält eine einzelne Prozessmethode , die Logik zum Ändern von Dateinamen enthält:

public class FileProcessor implements Processor { public void process(Exchange exchange) throws Exception { String originalFileName = (String) exchange.getIn().getHeader( Exchange.FILE_NAME, String.class); Date date = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd HH-mm-ss"); String changedFileName = dateFormat.format(date) + originalFileName; exchange.getIn().setHeader(Exchange.FILE_NAME, changedFileName); } }

Um den Dateinamen abzurufen, müssen wir eine eingehende Nachricht von einer Vermittlungsstelle abrufen und auf deren Header zugreifen. Ähnlich wie beim Ändern des Dateinamens müssen wir den Nachrichtenkopf aktualisieren.

5.2. Routing mit Spring DSL

Beim Definieren einer Route mit Spring DSL verwenden wir eine XML-Datei, um unsere Routen und Prozessoren einzurichten. Dies ermöglicht es uns, Routen ohne Code mithilfe von Spring zu konfigurieren und bietet letztendlich den Vorteil einer vollständigen Umkehrung der Steuerung.

Dies wurde bereits in einem bestehenden Artikel behandelt, daher konzentrieren wir uns auf die Verwendung von Spring DSL zusammen mit Java DSL, was üblicherweise eine bevorzugte Methode zum Definieren von Routen ist.

In dieser Anordnung wird CamelContext in einer Spring XML-Datei unter Verwendung einer benutzerdefinierten XML-Syntax für Camel definiert, jedoch ohne die Routendefinition wie im Fall von „reinem“ Spring DSL unter Verwendung von XML:

Auf diese Weise weisen wir Camel an, die FileRouter- Klasse zu verwenden, die die Definition unserer Route in Java DSL enthält:

public class FileRouter extends RouteBuilder { private static final String SOURCE_FOLDER = "src/test/source-folder"; private static final String DESTINATION_FOLDER = "src/test/destination-folder"; @Override public void configure() throws Exception { from("file://" + SOURCE_FOLDER + "?delete=true").process( new FileProcessor()).to("file://" + DESTINATION_FOLDER); } }

Um dies zu testen, müssen wir eine Instanz von ClassPathXmlApplicationContext erstellen, die unseren CamelContext im Frühjahr lädt :

@Test public void moveFolderContentSpringDSLTest() throws InterruptedException { ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("camel-context.xml"); Thread.sleep(DURATION_MILIS); applicationContext.close(); }

Durch die Verwendung dieses Ansatzes erhalten wir zusätzliche Flexibilität und Vorteile, die Spring bietet, sowie alle Möglichkeiten der Java-Sprache durch die Verwendung von Java DSL.

6. Fazit

In diesem kurzen Artikel haben wir eine Einführung in Apache Camel vorgestellt und die Vorteile der Verwendung von Camel für Integrationsaufgaben wie das Weiterleiten von Dateien von einem Ordner in einen anderen demonstriert.

In unserem Beispiel haben wir gesehen, dass Sie sich mit Camel auf die Geschäftslogik konzentrieren und die Menge an Boilerplate-Code reduzieren können.

Code aus diesem Artikel finden Sie auf GitHub.