
Sie konfigurieren den JDBC-Empfänger-Adapter, um damit XML-Messages von der Integration Engine in Inhalte von Datenbanktabellen zu verwandeln.
Die Konfiguration besteht im Wesentlichen aus der Angabe
Dieser Treiber gehört nicht zum Lieferumfang des Adapters sondern muss vom Datenbankhersteller oder Drittanbietern geliefert werden.
Sie haben
Für den JDBC-Empfänger-Adapter besteht die Konfiguration aus fünf funktionalen Teilbereichen:
Geben Sie den Namen der Klasse folgendermaßen an:
classname=com.sap.aii.messaging.adapter.ModuleXMB2DB
Diese Angabe ist zwingend.
30
Diese Angabe ist zwingend. Fehlt die Angabe, wird die Konfiguration als XI 2.0 Adapter-Konfiguration interpretiert. Andere Werte sind nicht zulässig und werden als Fehler ausgegeben.
Geben Sie den Modus des JDBC-Empfänger-Adapters an. Erlaubte Werte sind:
XMB2DB
XMB2DB_XML
XMB2DB_RAWSQL
Abhängig vom gewählten Modus bietet der Adapter verschiedene Funktionalitäten und erwartet dafür jeweils spezielle Dokumentenformate in der empfangenen Nachricht vom Integration Server. Grundsätzlich gilt:
XMB2DB
XMB2DB_XML
Diese Funktionalität wird jeweils durch die Übermittlung vordefinierter XML-Schemata beschrieben, die weiter unten erläutert werden. Hierbei können beliebige und beliebig viele Aktionen in einer Nachricht gebündelt werden. Alle Aktionen werden dann jeweils innerhalb einer Datenbanktransaktion ausgeführt, also komplett oder gar nicht.
XMB2DB_RAWSQL
In zukünftigen Versionen können weitere mögliche Verarbeitungsarten dazukommen.
<port_no>
<service> beschreibt den Service-Teil der Adresse, zu dem die Integration Engine ihre Nachrichten schicken muss.
Diese Angaben sind zwingend.
XI.httpPort=1234XI.httpService=/db/Receiver
http://<Datenbankadapterhost>:1234/db/Receiver
Für die Integration Engine in der Version 1.0 muss die Endpunkt-Adresse wie folgt erweitert werden:
http://<Datenbankadapterhost>:1234/db/Receiver?action=execute&pipelineid=Receiver
Wird die Nachricht von der Integration Engine an einen nicht spezifizierten Service des Adapters geschickt, erfolgt die Fehlermeldung
No registered listener for <service> found
ANGEHALTENINITIALISIERT
<Service>
Diese Angabe ist optional.
<Service>
Kann keine Verbindung zum SLD hergestellt werden, oder existiert das Business-System im SLD nicht, ist die Angabe bedeutungslos.
Diese Angaben sind alle zwingend und haben keine Vorschlagswerte.
>
Geben Sie die Java-Klasse des JDBC-Treibers an, die der JDBC-Adapter laden muss, um auf den Treiber zugreifen zu können. Die genaue Angabe variiert je nach JDBC-Treiber und muss aus den Unterlagen des jeweiligen Anbieters hervorgehen.
>
Geben Sie die Adresse an, unter der über den JDBC-Treiber eine Datenbankverbindung geöffnet werden kann. Das genaue Format der Adresse kann variieren und muss aus den Unterlagen des jeweiligen Anbieters hervorgehen.
Bei Datenbankverbindungsfehlern baut der JDBC-Adapter die Datenbankverbindung automatisch wieder neu auf.
Ein hier spezifiziertes Betriebssystemkommando wird nach fehlerfreien Datenbankoperationen ausgeführt. Der Vorschlagswert ist eine leere Zeichenkette (kein Kommando).
Bei einer SQL-Exception wird die Datenbankverbindung so oft wie angegeben neu aufgebaut und der Zugriff wird wiederholt. Ist die Anzahl der Wiederholungsversuche abgelaufen, wird der letzte Zustand an den sendenden Integration Server zurückgemeldet. Im Fehlerfall wird die Nachricht also erst dann erneut verarbeitet, wenn sie vom Integration Server erneut versendet wird.
Der Vorschlagswert ist 0.
Nach jeder Datenbanktransaktion wird die Datenbank geschlossen und die Datenbankverbindung wird aufgelöst (YES) bzw. aufrechterhalten (NO).
Der Vorschlagswert ist NO.
Die Transaktionsklammer, die der JDBC-Adapter benötigt um konsistente Daten in der Datenbank sicherzustellen, kann mit diesem Parameter abgeschaltet werden. Diese Option wird für JDBC-Treiber benötigt, die keine Transaktionen unterstützen. Es muss dann aber anderweitig sichergestellt werden, dass keine Dateninkonsistenzen in der Datenbank erzeugt werden können, das heißt, in der Regel müssen parallele Zugriffe unterbunden werden.
Der Vorschlagswert ist NO .
YES
Datenbanktransaktionen können in verschiedenen Abstufungen (Isolation Levels) betrieben werden. Der JDBC-Adapter verwendet standardmäßig die höchste Isolierungsstufe, um Datenbankinkonsistenzen durch parallele Datenbanktransaktionen zu vermeiden. Bei einigen JDBC-Treibern kann eine Reduzierung dieses Level notwendig sein, wenn der Treiber bzw. das Datenbankprodukt diesen Level nicht unterstützt. Eine Reduzierung des Level kann zu Lasten der Transaktionssicherheit und damit der Datenintegrität gehen und sollte nur wenn nötig angewendet werden. Die oben aufgeführten Werte entsprechen den folgenden JDBC-Konstanten:
Ist der Parameter nicht gesetzt, dann ist der Vorgabewert der angeschlossenen Datenbank wirksam.
Der Level sollte nur wenn nötig und nur so weit wie benötigt reduziert werden. Gegebenenfalls muss dann aber anderweitig sichergestellt werden, dass keine Dateninkonsistenzen in der Datenbank erzeugt werden können, das heißt, in der Regel müssen parallele Zugriffe unterbunden werden.
Die Behandlung von Nachrichten des Typs Exactly Once erfolgt, wie bei den übrigen Adaptern auch, standardmäßig über die Verwaltung von Statusinformationen für diese Nachrichten im Dateisystem. Auch in diesem Modus werden sämtliche Fehlerzustände des Adapters sowie extern eingeleitete Programmabbrüche (Shutdown des Adapter-Betriebssystemprozesses) korrekt behandelt.
Eine Ausnahme hierzu bilden externe Programmabbrüche während eines Datenbank-Commit. Dann ist der Zustand der Nachrichtenverarbeitung unklar, da er erst nach Abschluss des Datenbank-Commit in der Verwaltungsdatei geändert werden kann.
Eine solche Situation wird aber bei einem Neustart der Anwendung erkannt, und die Bearbeitung der abgebrochenen Nachrichtenverarbeitung kann über db.exactlyOnceErrorInPendingState gesteuert werden.
Diese Angabe wirkt sich aber nur auf die Behandlung von Fehlern aus, die während einer wiederholten Bearbeitung von Nachrichten auftreten, deren erste Bearbeitung in dem oben beschriebenen unklaren Zustand verblieben war.
Tritt nun bei der erneuten Bearbeitung ein Fehler auf, wird dieser standardmäßig (oder wenn explizit der Wert ERROR gesetzt ist), als Fehler an das rufende System zurückgemeldet.
Tritt der Fehler aber auf, weil die Nachricht beim erstenmal doch schon in der Datenbank gespeichert wurde und sich dort noch befindet (typischerweise wird die Datenbankschnittstelle dann den Fehler duplicate insert ausgeben, falls mindestens eines der Tabellenfelder als Primary Key definiert wurde), kann mit dem Wert IGNORE die Bearbeitung für das sendende System erfolgreich abgeschlossen werden. Ansonsten wird das sendende System die Nachricht immer wieder erneut verschicken, und der Fehler tritt immer wieder auf.
Trotzdem verbleibt in der Behandlung von Exactly Once eine, wenn auch sehr kleine, Lücke: ist in der Datenbanktabelle kein Feld Primary key ausgewiesen, oder wurden die Daten von einer anderen Anwendung bereits weiterverarbeitet und anschließend gelöscht, kann die Nachricht auf diese Weise dupliziert werden, wenn die erste Verarbeitung genau nach dem Datenbank-Commit durch ein externes Beenden des Adapter-Prozesses unterbrochen wurde. Diese Lücke kann nur geschlossen werden, wenn sich die Nachrichtenverarbeitung und die Verwaltung der Statusinformationen in der gleichen Datenbank befinden, so dass ein gemeinsamer Commit-Zyklus der Verarbeitungsschritte möglich wird.
Hierzu muss in der Datenbank, in der die zu schreibende Tabelle liegt, eine zusätzliche Tabelle mit zwei Spalten angelegt werden. Spalte 1 muss vom Typ character mit Länge 36 (oder mehr) sein und den Namen XIMessage_ID tragen. Spalte 2 muss vom Typ integer sein, mit Namen XIMessage_Ts. Diese Tabelle wird dem Adapter dann wie folgt bekannt gemacht:
Ist dieser Wert gesetzt, wird anstelle der datei-basierten Exactly-Once-Verwaltung die angegebene Datenbanktabelle benutzt. Existiert die Tabelle nicht, oder werden die benötigten Spalten nicht gefunden oder sind vom falschen Typ, wird ein entsprechender Fehler ausgegeben und der Adapter startet nicht.
Soll ein anderer Spaltenname als XIMessage_Id vergeben werden (weil zum Beispiel eine bereits existierende Tabelle benutzt werden soll), kann dieser Wert hier für die Spalte vom Typ char(36) angegeben werden. Ist eine größere Feldlänge spezifiziert, kann die Tabelle trotzdem benutzt werden. Kürzere Feldlängen sind jedoch nicht möglich. Dieser Wert wird nur ausgewertet, wenn db.tableForExactlyOnceHandling gesetzt wurde.
Soll ein anderer Spaltenname als XIMessage_Ts vergeben werden (weil zum Beispiel eine bereits existierende Tabelle benutzt werden soll), kann dieser Wert hier für die Spalte vom Typ integer angegeben werden. Dieser Wert wird nur ausgewertet, wenn db.tableForExactlyOnceHandling gesetzt wurde.
>
60
Wird der Wert auf 0 oder eine negative Zahl gesetzt, werden bei jeder Adapter-Initialisierung alle Verwaltungsinformationen gelöscht. Dies kann zu Testzwecken sinnvoll sein, sollte aber keinesfalls im Produktivbetrieb gemacht werden.
Das XML-Dokumentenformat hängt, wie bereits erläutert, vom Modus des JDBC-Adapters ab.