Bei der Integration von Daten aus Fremdsystemen bspw. für den Import kommen immer wieder die gleichen Anforderungen auf.
- Wir haben hier eine Datei in einem bestimmten Format, die ihr in euer System übernehmen müsst.
- Wir können euch zwar die Daten liefern, aber weitere Informationen dazu liegen in einem anderen System vor.
- usw.
Diese Anforderungen gleichen meistens einem bestimmten Muster. Apache Camel ist ein Framework für solch eine Integration von Systemen und Datenformaten. Es liefert bereits sehr viele Lösungsmuster für diese Art von Implementierungen.
Ich habe mir ein ganz kleines Beispiel einer solchen Integration herausgesucht und möchte euch die Nutzung von Apache Camel in Verbindung mit einer Quarkus-Anwendung zeigen. Wir bekommen unsere Daten in Form einer CSV-Datei und möchten diese als Java Klassen in unserer Anwendung nutzen.
@Data
@CsvRecord(separator = ",", skipFirstLine = true)
public class Customer {
@DataField(name = "id", pos = 1)
private String id;
@DataField(name = "name", pos = 2)
private String name;
}
Um einen Import von CSV-Daten ohne ein Mapping oder einen Konverter zu lösen gibt es in Camel das Datenformat Bindy. Damit ist es möglich, durch den Einsatz von Annotationen, die Java Klasse entsprechend vorzubereiten.
Apache Camel arbeitet die Aufgaben in sogenannten Routen ab. Diese können in Java mit Hilfe eines Route-Builders erstellt werden. Für den Import ergibt sich somit die folgende Route:
from("file:{{import.location}}")
.log("Processing file: ${file:name}")
.unmarshal()
.bindy(BindyType.Csv, Customer.class)
.split(body())
.to("direct:doImport");
Hierbei weisen wir Camel an die Dateien in einem bestimmten Verzeichnis zu überwachen und diese dann zunächst von CSV in unsere Customer
Klasse umzuwandeln. Da es sich hierbei um eine Liste von Daten handelt, teilen wir diese Liste in ihre einzelnen Einträge auf und geben die weitere Verarbeitung an eine weitere Route.
In dieser Route übergeben wir jedes einzelne Customer
Objekt in eine CDI-Bean. Diese haben wir mit einer @Named
-Annotation versehen und können diesen Namen in der Route ansprechen.
from("direct:doImport")
.bean("importService", "importCustomer");
Wir übergeben also an die CDI-Bean mit dem Namen importService
und rufen die Methode importCustomer
auf. Diese bekommt als Parameter ein Customer
Objekt übergeben. Damit bin ich in meiner Java-Welt angekommen und kann das Objekt in meiner Anwendung nutzen.
Mit Hilfe von Apache Camel lassen sich die alltäglichen Probleme der Integration von Daten auf einfache Art und Weise lösen, ohne jedes mal das Rad neu erfinden zu müssen. Das Beispiel findet ihr wie immer auf Github.