Batch-Import
Ein Batch-Import verarbeitet eine Serie von Import-Aufrufen als "Batch" (engl. "Stapel") in einem einzigen "Job". Jeder einzelne Import-Aufruf im "Batch" entspricht dabei funktional einem Single-Import mit der entsprechenden Struktur und Logik.
Die Seite Import bietet einen Überblick zum Zusammenspiel zwischen Lobster Data Platform / Orchestration und Lobster_data und beschreibt den allgemeinen Aufbau eines Importprofils.
Die für den Single-Import verwendete Struktur entspricht exakt dem Inhalt eines einzelnen batch-Knotens beim Batch-Import.
Nachfolgend stehen deshalb vor allem die Details der Batch-Verarbeitung im Fokus, während die für den Single-Import dokumentierten Details zur eigentlichen Import-Struktur vorausgesetzt werden.
In der Praxis kann man auch für den Import einzelner Objekte die Batch-Import-Struktur zu verwenden. Dann stehen bei Bedarf auf die für den Batch-Import zusätzlich verfügbaren Funktionalitäten zur Verfügung.
Elemente der Zielstruktur für einen Batch-Import
Beim Anlegen eines Importprofils für einen Batch-Import wird die Zielstruktur idealerweise ausgehend von der Lobster Data Platform / Orchestration-Vorlage für das core:BatchImport -Objekt erstellt (Details s. Lobster_pro Vorlagen).
Der folgende Screenshot zeigt eine aus der core:BatchImport-Vorlage generierte Zielstruktur, für die hier informativ die Spalte "Datentyp" eingeblendet ist:
Der durch Auswahl hervorgehobene "Wurzelknoten" (BatchImport) enthält eine Reihe von Feldern für Parameter, die den Batch-Import betreffen. Diese werden in den folgenden Unterabschnitten vorgestellt.
Unterhalb (im Screenshot durch den blauen Rahmen hervorgehoben) stellt die Vorlage einen einzigen batch-Knoten bereit, der bei Bedarf entweder zur Laufzeit iteriert oder schon in der Definition der Zielstruktur explizit mehrfach enthalten sein kann. Jeder einzelne batch-Knoten wird parametriert und interpretiert wie der core:Import -Knoten bei einem Single-Import. Der Screenshot zeigt nur die von der Vorlage bereitgestellten Elemente. Innerhalb eines batch-Knotens ist dabei in der Regel noch die Objektstruktur zu ergänzen, die durch genau einen (oder mehrere strikt alternativ angesteuerte) Unterknoten definiert werden kann (Details siehe Single-Import und Lobster_pro Vorlagen).
Transaktionskontrolle (trxControl-Atttribut)
Über das Attribut trxControl kann einer der folgenden Modi für die Transaktionskontrolle für den Batch-Import ausgewählt werden:
Transaktionskontrollmodus |
Beschreibung |
SINGLE |
Jeder batch-Knoten wird als eigenständige Transaktion verarbeitet. |
BATCH |
Alle batch-Knoten werden in einer gemeinsamen Transaktion verarbeitet. |
BATCH_OR_EXISTING |
Für jedes zu importierende Objekt wird geprüft, ob im Aufrufkontext bereits eine gültige Transaktion besteht.
►HINWEIS◄ Dieser Modus macht dann Sinn, wenn mehrere Profile oder Ereignisse in einer Transaktion miteinander verknüpft werden sollen. |
Antwortverhalten (responsive-Attribut)
Dem Attribut responsive kann ein boolescher Wert zugewiesen werden, um im Kontext eines Funktionsaufrufs (s. Lobster_pro: Import (_data-Funktion)) zu entscheiden, ob die per Batch-Import verarbeiteten Objekte als Rückgabewert der Funktion ausgegeben werden sollen (true) oder nicht (false).
►HINWEIS◄ Falls der Batch-Import als Zielstruktur eines Profils definiert wird, ist dieses Attribut irrelevant.
Attribute für die Fehlerbehandlung
Attribut |
Datentyp |
Standardwert |
Beschreibung |
optimisticRetries |
Integer |
0 |
Ein Wert >0 definiert die maximale Anzahl der Wiederholungsversuche bei einem Schreibkonflikt (Optimistic-Lock-Exception). Mit dem Wert 0 (bzw. wenn das Attribut nicht verwendet wird) erfolgt keine Wiederholung. |
optimisticRetryDelay |
BigInteger |
0 |
Ein Wert > 0 definiert die Wartezeit in Sekunden vor einem Wiederholungsversuch bei einem Schreibkonflikt (Optimistic-Lock-Exception). |
stopOnFirstError |
Boolean |
false |
Mit dem Wert true erfolgt im Transaktionskontrollmodus SINGLE ein Abbruch sobald ein Fehler auftritt. Mit dem Wert false (bzw. wenn das Attribut nicht verwendet wird) werden nachfolgende batch-Knoten auch nach einem Fehler verarbeitet. |
failAfterErrors |
Boolean |
true |
Mit dem Wert true (bzw. wenn das Attribut nicht verwendet wird) gilt der Batch-Import sobald ein Fehler auftritt als Fehlschlag:
Mit dem Wert false gilt der Batch-Import nicht als fehlgeschlagen, wenn ein Fehler auftritt (s. a. singleErrorHandlerProfile):
|
singleErrorHandlerProfile |
String |
(leer) |
Der Eintrag benennt ein Profil, das im Transaktionskontrollmodus SINGLE als Fehlerbehandlung aufgerufen wird; Das angegebene Profil erhält als Eingangsdaten eine core:Import-Struktur (s. Single-Import), die den batch-Knoten widerspiegelt, der den Fehler verursacht hat.
|
Beispiel
Das folgende Beispiel demonstriert den Einsatz eines Batch-Imports zum Importieren von Stammdaten für Orte, die in Lobster Data Platform / Orchestration zum automatischen Vervollständigen von Adressdaten herangezogen werden.
Parser (Phase 2)
Damit das Splitten der Eingangsdaten in handliche Datenmengen je Datenblatt auch auf die effektive Ausführung des Imports wirkt, müssen in Phase 2 des Profils die Optionen Pro Datenblatt Antwortwege ausführen und IU miteinbeziehen gesetzt sein:
Mit diesen Einstellungen erzeugt das Profil zur Laufzeit für jedes Datenblatt einen eigenständigen Batch-Import-Job, der maximal so viele batch-Knoten beinhaltet, wie per Parameter rows im tokenFileSplitter-Preparser spezifiziert.
Mapping (Phase 3)
Die Quellstruktur (1) muss ausgehend vom importierten Dateiformat aufgebaut werden. Der folgende Screenshot zeigt abwärts von einem city benannten Knoten die anzulegenden Felder mit Datentyp (inkl. Test-Daten). Jede Zeile liefert die Daten für genau ein zu erstellendes Orte-Datenobjekt.
Oberhalb des city-Knotens wurde hier der newPage-Knoten eingehängt, der zum Aufteilen der Quelldaten in Datenblätter dient (s. o.).
►HINWEIS◄ Für die Felder latitude und longitude wurde der Datentyp BigDecimal gewählt, für den in der Felddefinition außerdem eine passende Vorlage für die Umwandlung des Texts in Zahlenwerte gewählt werden muss.
Für den Aufbau der Zielstruktur bietet Lobster_data spezifische Vorlagen (s. Lobster_pro Vorlagen) für die Datenstrukturen von Lobster Data Platform / Orchestration an.
Zunächst wurde die core:BatchImport-Vorlage (2) mit der Basisstruktur für einen Batch-Import geladen. Im Bild ist für die Transaktionskontrolle bereits der Typ BATCH als Fixwert eingetragen, da die eingelesenen Orte per Batch und nicht einzeln importiert werden sollen.
Innerhalb des batch-Knotens (3) ist die Aktion CREATE als Fixwert eingetragen, da je eingelesene Zeile beim Import ein neues Orte-Datenobjekt erstellt werden soll. Der batch-Knoten ist mit dem city-Knoten der Quellstruktur per Pfad verbunden, damit er für jede eingelesene "City" wiederholt wird.
Die Knoten eventStorge und search werden hier nicht benötigt und sind inaktiv gesetzt. Sie könnten auch gelöscht werden.
Für den City-Knoten (4) wurde wiederum eine der Lobster_pro Vorlagen (base:City) verwendet, die mit der Option Keine Entity Attribute als Unterknoten zum batch-Knoten eingehängt wurde:
Die Zuordnung der Quelldatenfelder zu den Zielfeldern im City-Knoten ergibt sich selbsterklärend aus den Beschriftungen.Die Feldeinstellungen für die "dezimalen" Zielfelder latitude und longitude sollten passend zum Dateninhalt so gewählt werden, dass nicht unbeabsichtigt Nachkommastellen abgeschnitten werden.
►HINWEIS◄ Die Konfiguration für Phase 4 entfällt. Die Phasen 5 und 6 werden wie unter Import nachzulesen eingerichtet. Hier sind keine spezifischen Einstellungen für den Batch-Import erforderlich.
Ergebnisse
Um die Wirkung des hier als Besonderheit eingesetzten tokenFileSplitter-Preparsers zu veranschaulichen, wurde der rows-Wert vorübergehend auf 5 eingestellt und ein Mapping-Test mit einem kleineren Datensatz (nur die "Orte" in Chile) ausgeführt:
Die Quellstruktur (links) zeigt, dass Datenblätter mit jeweils (maximal) 5 City-Knoten erstellt werden.
Der erste City-Knoten in der Quellstruktur entspricht dem ersten batch-Knoten in der Zielstruktur (rechts) expandiert und zeigt identische Daten.
Der Batch-Import-Job für das ersten Datenblatt (Record 1 in der Zielstruktur beim Mapping-Test) wäre wie folgt aufgebaut:
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<
core
:BatchImport ...
trxControl
=
"BATCH"
>
<
batch
action
=
"CREATE"
>
<
base
:City
country
=
"CL"
postalCode
=
"2340000"
placeName
=
"Valparaíso"
state
=
"Región de Valparaíso"
stateCode
=
"01"
countyCode
=
"51"
county
=
"Provincia de Valparaíso"
community
=
"Valparaíso"
communityCode
=
"05101"
latitude
=
"-33.1298"
longitude
=
"-71.5735"
accuracy
=
"4"
></
base
:City>
</
batch
>
<
batch
action
=
"CREATE"
>
<
base
:City
country
=
"CL"
postalCode
=
"2480000"
placeName
=
"Casablanca"
state
=
"Región de Valparaíso"
stateCode
=
"01"
countyCode
=
"51"
county
=
"Provincia de Valparaíso"
community
=
"Casablanca"
communityCode
=
"05102"
latitude
=
"-33.3158"
longitude
=
"-71.4353"
accuracy
=
"4"
></
base
:City>
</
batch
>
<
batch
action
=
"CREATE"
>
<
base
:City
country
=
"CL"
postalCode
=
"2490000"
placeName
=
"Quintero"
state
=
"Región de Valparaíso"
stateCode
=
"01"
countyCode
=
"51"
county
=
"Provincia de Valparaíso"
community
=
"Quintero"
communityCode
=
"05107"
latitude
=
"-32.843"
longitude
=
"-71.4738"
accuracy
=
"4"
></
base
:City>
</
batch
>
<
batch
action
=
"CREATE"
>
<
base
:City
country
=
"CL"
postalCode
=
"2500000"
placeName
=
"Puchuncaví"
state
=
"Región de Valparaíso"
stateCode
=
"01"
countyCode
=
"51"
county
=
"Provincia de Valparaíso"
community
=
"Puchuncaví"
communityCode
=
"05105"
latitude
=
"-32.7176"
longitude
=
"-71.4111"
accuracy
=
"4"
></
base
:City>
</
batch
>
<
batch
action
=
"CREATE"
>
<
base
:City
country
=
"CL"
postalCode
=
"2510000"
placeName
=
"Concón"
state
=
"Región de Valparaíso"
stateCode
=
"01"
countyCode
=
"51"
county
=
"Provincia de Valparaíso"
community
=
"Concón"
communityCode
=
"05103"
latitude
=
"-32.9534"
longitude
=
"-71.4678"
accuracy
=
"4"
></
base
:City>
</
batch
>
</
core
:BatchImport>