In diesem Teil lernen wir Router, Content Modifier, Content Enricher und ein wenig mehr von Groovy Scripting kennen, um unseren Integrationsfluss weiter auszubauen
Hallo Technologietramper!
Willkommen zum dritten Teil der Enterprise Integration mit SAP CPI. In den ersten beiden Teilen (lesen Sie die erste und zweite (falls noch nicht geschehen) haben wir unser Integrationsszenario festgelegt, den Ansatz in 7 Schritte unterteilt und auch die ersten drei Schritte der Lösung besprochen. Bei der Erstellung unseres Integrationsablaufs lernten wir Nachrichtenereignisse, Start-Timer und einige Zeitplanungsoptionen, Request Reply Shape, Groovy Script Shape, allgemeine und iterative Splitter kennen.
In diesem Teil werden wir den 4. Schritt besprechen:
- Konfigurieren Sie die Integration so, dass sie jeden Tag ausgeführt wird.
- Erhalten Sie die Liste der Produkte
- Ermitteln Sie für jedes Produkt in der Liste, ob eine Nachbestellung erforderlich ist.
- Wenn das Produkt nachbestellt werden muss, Informationen über den Lieferanten einholen
- Erstellen Sie eine Liste der nachzubestellenden Produkte zusammen mit Lieferanteninformationen
- Liste in CSV-Format umwandeln
- Liste per E-Mail an den Manager senden
Bis jetzt haben wir einzelne Produkte extrahiert und festgestellt, ob sie nachbestellt werden müssen oder nicht. Wenn ein Produkt nachbestellt werden muss, setzen wir die Nachrichteneigenschaft needsReorder
zu wahr
. Andernfalls wird der Wert auf falsch
.
Schritt 4: Wenn ein Produkt nachbestellt werden muss, erhalten Sie Informationen über den Lieferanten
(Verwendete technische Konzepte: Message Router, Content Modifier, Gather, Content Enricher)
Da wir nun wissen, welche Produkte nicht nachbestellt werden müssen, können wir diese Produkte sicher aus dem Integrationsfluss ausschließen, da sie nicht weiter verarbeitet werden müssen. Um diese Produkte von denen zu trennen, die nachbestellt werden müssen, verwenden wir einen Message Router.
Sehr häufig treten Szenarien auf, in denen wir Nachrichten, die durch unsere Integration fließen, auf der Grundlage einer Bedingung trennen und einer unterschiedlichen Behandlung unterziehen möchten. Ein Message-Router ist eine Form, die dazu dient, Nachrichten auf der Grundlage bestimmter Kriterien an verschiedene Routen zu senden. Sie können über Router lesen hier.
Um den Message Router in unseren Integrationsfluss aufzunehmen, klicken Sie auf Message Routing->Router.

Platzieren Sie das Router-Shape zwischen dem Groovy-Script-Shape und dem Message-End-Shape.

Bevor wir verschiedene Routen erstellen, müssen wir entscheiden, wie viele Routen benötigt werden, welche Nachrichten auf diesen Routen gesendet werden sollen und welche Operationen auf ihnen durchgeführt werden sollen. Wie bereits erwähnt, werden wir zwei Routen erstellen - eine für Produkte, die nachbestellt werden müssen, und eine für Produkte, die nicht nachbestellt werden müssen. Wir wissen, welche Aktionen für die Produkte, die nachbestellt werden müssen, durchgeführt werden sollen. Wir wissen auch, dass die Produkte, die nicht nachbestellt werden müssen, verworfen/nullifiziert werden können.
Wir werden einen Content Modifier Shape verwenden, um die Meldungen für Produkte, die nicht nachbestellt werden müssen, aufzuheben. Wie der Name schon sagt, ist ein Inhaltsmodifikator shape ermöglicht es uns, eine Nachricht zu modifizieren, indem wir ihren Textkörper, ihre Kopfzeilen und ihre Eigenschaften ändern. In diesem Fall wollen wir den Nachrichtentext in Null ändern.
Um einen Content Modifier hinzuzufügen, klicken Sie auf Message Transformers->Content Modifier.

Platzieren Sie ihn zwischen dem Nachrichtenrouter und den Endnachrichtenformen.

Klicken Sie nun auf den Inhaltsmodifikator, gehen Sie zur Registerkarte "Nachrichtentext" und setzen Sie den Wert von "Text" auf null.

Wenn Sie den Integrationsfluss an dieser Stelle speichern, sehen Sie Fehlermarkierungen an den Formen und Verbindungen:

Der Grund dafür ist, dass wir für diese Route keine Routenbedingung angegeben haben und dass es nur eine Route gibt. Klicken Sie auf den Anschluss mit der Bezeichnung "Route 1" und wählen Sie auf der Registerkarte "Verarbeitung" die Option "Standardroute". Das bedeutet, dass alle Nachrichten diese Route durchlaufen müssen, wenn sie keiner anderen Routenbedingung entsprechen. Der nächste logische Schritt ist das Hinzufügen einer Route für Produkte, die nachbestellt werden müssen.
Wir hatten die Liste aller Produkte für die Bewertung in einzelne Produkte aufgeteilt, aber wir müssen am Ende eine konsolidierte Liste an den Filialleiter senden. Zu diesem Zweck verwenden wir eine Gather-Form. Sammeln Sie shape wird verwendet, um Nachrichten auf einer oder mehreren Routen auf eine in der Konfiguration festgelegte Weise zu sammeln.
Klicken Sie auf Message Routing->Gather und platzieren Sie es so auf der Leinwand:

Klicken Sie auf die Routerform und zeichnen Sie eine Verbindung zu Gather, die automatisch als 'Route 2' bezeichnet wird.

Klicken Sie auf Route 2 und setzen Sie unter der Registerkarte Verarbeitung die Bedingung auf : ${property.needsReorder} = 'wahr'

Wir haben also festgelegt, dass, wenn die Nachrichteneigenschaft needsReorder
wird eingestellt auf wahr
muss die Nachricht dieser Route folgen, ansonsten wird die Standardroute genommen. Außerdem muss jede Route an einem bestimmten Punkt enden. Zeichnen Sie ein Verbindungsstück von Gather Shape zu Message End shape, um die Route zu vervollständigen.

Jetzt werden wir die Verbindung zwischen Inhalt Modifikator und Ende shape zur Verbindung mit Sammeln Sie stattdessen die Form. Warum sollten wir das tun, fragen Sie? Logischerweise hätten wir es so lassen können, wie es war. Wir haben die Nachrichtenkörper für Produkte, die nicht nachbestellt werden müssen, gelöscht und den Prozess für diese Nachrichten danach beendet. Dies hätte jedoch dazu geführt, dass mehrere Nachrichten die Endform erreicht hätten. Angenommen, es gäbe 80 Produkte, die nicht nachbestellt werden müssen, dann hätten wir neben der konsolidierten Liste, die wir für die Produkte erstellen, die nachbestellt werden müssen, noch 80 weitere Nachrichten, die den End Shape erreichen. Das könnte zu Problemen bei der Nachverfolgung dieser Nachrichten führen, oder schlimmer noch, zu 80 unnötigen E-Mails!

Wir müssen die Form Gather konfigurieren und das Eingangsformat und den Aggregationsalgorithmus festlegen. Wir wissen, dass wir Nachrichten sammeln wollen, die Details zu Produkten enthalten, und auch einige Nachrichten mit nichtigem Textkörper, und dass sie zu einer einzigen Nachricht verkettet werden sollen. Daher werden wir das Eingangsformat auf "Plain Text" und den Aggregationsalgorithmus auf "Concatenate" setzen. Sie können auch andere Optionen verwenden, je nach Relevanz und Ihren Vorlieben. Sie können mehr über Gather Shape lesen hier.

Wir haben zwar ein Shape zum Sammeln hinzugefügt, aber keine Shapes für die Operationen, die an den Nachrichten auf Route 2 durchgeführt werden müssen, bevor sie gesammelt werden. Das Ziel ist es, jeder dieser Nachrichten Lieferanteninformationen hinzuzufügen, und dies kann in die folgenden Aufgaben unterteilt werden:
- Produkt-ID aus Nachricht abrufen
- Abrufen von Lieferanteninformationen über die Produkt-ID
- Nachrichtenkörper bilden, die für die Verkettung geeignet sind
1. Produkt-ID aus Nachricht abrufen
Zu diesem Zweck werden wir einen Content Modifier verwenden. Wie bereits erwähnt, wird ein Content Modifier Shape verwendet, um den Nachrichtentext, die Eigenschaften und die Kopfzeilen zu ändern. Wir haben ihn bereits verwendet, um den Nachrichtentext auf Null zu setzen. Jetzt werden wir die Produkt-ID aus dem Nachrichtentext extrahieren und sie in den Nachrichteneigenschaften speichern.
Fügen Sie einen Inhaltsmodifikator zwischen den Formen Router und Gather ein.

Wir werden einen XPath-Ausdruck verwenden, um die Produkt-ID aus dem Nachrichtentext zu extrahieren: /Produkte/Produkt/LieferantID

2. Abrufen von Lieferanteninformationen über die Produkt-ID
Zu diesem Zweck werden wir eine Form namens Inhaltsanreicherung'.die Daten aus einer externen Quelle (Lookup Message) abruft und sie zu den vorhandenen Daten (Original Message) hinzufügt. In unserem Fall möchten wir den Produktdaten, die wir derzeit im Nachrichtentext haben, Informationen zum Lieferanten hinzufügen.
Zum Hinzufügen einer Inhaltliche BereicherungKlicken Sie auf Call->External Call->Content Enricher und platzieren Sie es zwischen Content Modifier und Gather Shapes:

Da wir Daten von einer entfernten Quelle abrufen werden, fügen wir einen Empfänger hinzu, wie wir ihn im ersten Schritt des Integrationsablaufs hinzugefügt haben, um Produktinformationen zu erhalten. Fügen Sie einen Empfänger und dann einen OData-Adapter vom Empfänger zum Content Enricher.

Klicken Sie auf den OData-Adapter, um die Verbindung zu konfigurieren. Die Konfiguration ist sehr ähnlich zu Schritt 2, der im Abschnitt erster Teil dieser Blogserie, aber anstelle von "Produkten" beziehen wir Daten von "Lieferanten".


Nun wählen wir den Aggregationsalgorithmus für den Content Enricher. Es gibt zwei Optionen für den Aggregationsalgorithmus:
- Mähdrescher: Bei Verwendung dieser Option wird die Lookup-Nachricht an die Originalnachricht angehängt.
- Bereichern Sie: Bei Verwendung dieser Option wird die Lookup-Nachricht mit der Original-Nachricht über ein gemeinsames Feld zusammengeführt.
In unserem Szenario wollen wir Lieferantendetails in Produktinformationen zusammenführen, indem wir die Lieferantendaten als gemeinsames Feld verwenden und daher Enrich als unseren Aggregationsalgorithmus auswählen. Sie können mehr über Content Enricher lesen hier.

Sowohl für die Anreicherung als auch für die ursprüngliche Nachricht müssen wir den Pfad zum Knoten angeben, in dem die Entitätsdaten enthalten sind, wie in unserem Fall die Produkt- und Lieferantendetails. Das Schlüsselelement ist der Name des Elements, das für die Zusammenführung abgeglichen werden muss. Die Konfiguration sieht wie folgt aus:

Zu diesem Zeitpunkt haben wir die Lieferanteninformationen in die Produktinformationen integriert und die angereicherten Daten sehen wie folgt aus:
8
falsch
13
13
Nord-Ost-Fisch Handelsgesellschaft mbH
Frahmredder 112a
(04721) 8713
27478
Deutschland
Cuxhaven
Sven Petersen
Koordinator Auslandsmärkte
25.8900
Nord-Ost Matjeshering
10 - 200 g Gläser
0
30
15
10
3. Nachrichtenkörper bilden, die für die Verkettung geeignet sind
Wir haben Produktdetails zusammen mit den Details der Lieferanten, aber die resultierende XML-Datei hat ein verschachteltes Format, bei dem sich die Lieferantendetails nicht auf derselben hierarchischen Ebene befinden wie der Rest der Produktdetails. Es ist wichtig, dass sich alle Daten auf der gleichen Ebene befinden, damit die Nachricht effektiv in das CSV-Format konvertiert werden kann. Daher müssen die folgenden Aufgaben mit diesen Daten durchgeführt werden:
- Alle relevanten Daten auf derselben hierarchischen Ebene in der XML-Datei abrufen.
- Entfernen Sie doppelte Daten, falls vorhanden.
Um dies zu erreichen, werden wir das folgende Groovy-Skript verwenden:
import com.sap.gateway.ip.core.customdev.util.Message;
import java.util.HashMap;
import groovy.util.XmlSlurper; ;
import groovy.xml.XmlUtil;
def Message processData(Message message) {
//Körper
def body = message.getBody(java.lang.String) as String;
def rootNode= new XmlSlurper().parseText(body);
def product=rootNode.Product;
product.SupplierID.replaceNode{
};
product.appendNode(product.Supplier.SupplierID);
product.appendNode(product.Supplier.ContactName);
product.appendNode(product.Supplier.ContactTitle);
product.appendNode(product.Supplier.CompanyName);
product.appendNode(product.Lieferant.Adresse);
product.appendNode(product.Lieferant.Telefon);
product.appendNode(product.Lieferant.Postleitzahl);
product.appendNode(product.Lieferant.Land);
product.Lieferant.replaceNode{};
def flatXML=XmlUtil.serialize(produkt);
flatXML=flatXML-"""""";
flatXML=flatXML-""""";
message.setBody(flatXML);
Nachricht zurückgeben;
}
In diesem Skript verwenden wir zunächst XMLSlurper
um den XML-Körper zu lesen, um relevante Lieferanteninformationen aus dem Lieferantenknoten zu extrahieren, der während der Anreicherung hinzugefügt wurde. Anschließend fügen wir diese Informationen dem Produktknoten hinzu, so dass wir alle erforderlichen Informationen auf der gleichen hierarchischen Ebene haben. Dies geschieht mit appendNode
Methode der XMLSlurper
. Sobald wir die erforderlichen Informationen in dem gewünschten Format haben, entfernen wir die redundanten Datenknoten mit replaceNode
.
Wenn Sie sich das Skript ansehen, werden Sie feststellen, dass wir den Knoten entfernt haben, der Anbieter-ID
Informationen vor dem Anhängen Daten der Lieferanten
. Dies geschieht, um die Erstellung redundanter Daten zu vermeiden. Vielleicht fragen Sie sich aber, warum wir die Daten der Lieferantennummer hinzugefügt haben, wenn sie doch schon vorher vorhanden waren. Wenn wir Node mit XMLSlurper anhängen, werden die Daten am Ende hinzugefügt. In unserem Fall werden alle Lieferanteninformationen am Ende des Produktknotens hinzugefügt, so dass alle Daten zusammen bleiben. Wenn wir diese Daten zu einem späteren Zeitpunkt in das CSV-Format konvertieren, ist es logisch, dass die Lieferanteninformationen an derselben Stelle stehen und nicht über die Produktinformationen verstreut sind. Bitte beachten Sie, dass dies nicht der einzige Weg ist, um dieses Ergebnis zu erreichen, und wir werden die anderen Möglichkeiten zu einem späteren Zeitpunkt diskutieren.
Das war's! Wir werden diesen Blog hier unterbrechen, damit Sie die Themen, auf die wir gestoßen sind, vollständig verstehen und würdigen können. In diesem Blogbeitrag haben wir etwas über Router, Content Modifier, Content Enricher und ein wenig mehr über Groovy Scripting gelernt. Im nächsten Blog-Beitrag werden wir unter anderem etwas über die Konvertierung von XML in CSV und den Mail-Adapter lernen, um unsere Reise in die Unternehmensintegration mit SAP CPI abzuschließen. Bis dahin, auf Wiedersehen und viel Spaß beim Lernen!