Zusammengesetzter Nachrichtenprozessor (BizTalk Server-Beispiel)
Der Zweck dieses Beispiels ist es, eine Anwendung für einen zusammengesetzten Nachrichtenprozessor zu erstellen, die einzelne Zeilenelemente aus aggregierten Nachrichten verarbeitet.
Sie werden einen Orchestrierungszeitplan erstellen, der insbesondere die folgenden Aufgaben übernimmt:
Empfangen einer Batchaustauschnachricht, die aus mehreren Bestellungen besteht.
Disassemblieren der Austauschnachricht in einzelne Bestellungsdokumente.
Verarbeiten der einzelnen Dokumente, wobei jede Bestellung in eine Rechnungsnachricht konvertiert wird.
Assemblieren aller Rechnungsnachrichten in einen Batchaustausch.
Schritt 3 wurde zu Beispielzwecken vereinfacht. In komplexeren Anwendungen kann eine Orchestrierung z. B. disassemblierte Bestellungen an unterschiedliche Back-End-Bestandssysteme senden und diese dann nach der Erfassung aller Antworten in einer Batchrechnungsnachricht zusammenfassen.
Weitere Informationen zum Muster für den zusammengesetzten Nachrichtenprozessor finden Sie unter [1].
Ziel des Beispiels
In der Beispielprojektmappe befinden sich zwei Projekte, die beide in den folgenden Abschnitten ausführlich beschrieben werden.
Pipelines und Schemas
Das Projekt für Pipelines und Schemas enthält Folgendes:
Flatfile-Schemas für den Austausch von Eingabebestellungen und den Austausch von Ausgaberechnungen.
Zuordnung zum Transformieren von Bestellungsdokumenten in Rechnungsdokumente.
Empfangs- und Sendepipelines.
Flatfile-Schemas für Eingabe- und Ausgabeaustauschvorgänge
Unsere Beispielanwendung arbeitet mit den Austauschvorgängen im Flatfileformat. Nachfolgend finden Sie die Beispiele des Bestellungsaustauschs und des Rechnungsautauschs:
Bestellungsaustausch (CMPInput.txt):
Northwind Shipping
Batch type:Purchase Orders
PO1999-10-20
US Alice Smith 123 Maple Street Mill Valley CA 90952
US Robert Smith 8 Oak Avenue Old Town PA 95819
Hurry, my lawn is going wild!
ITEMS,ITEM872-AA|Lawnmower|1|148.95|Confirm this is electric,ITEM926-AA|Baby Monitor|1|39.98|Confirm this is electric|1999-10-21
PO1999-10-21
US John Dow 123 Elm Street Mill Valley CA 90952
US July Dow 8 Pine Avenue Old Town PA 95819
Please ship it urgent!
ITEMS,ITEM398-BB|Tire|4|324.99|Wrap them up nicely,ITEM201-BB|Engine Oil|1|12.99|SAE10W30|1999-05-22
PO1999-10-23
US John Connor 123 Cedar Street Mill Valley CA 90952
US Sarah Connor 8 Grass Avenue Old Town PA 95819
Use cheapest shipping method.
ITEMS,ITEM101-TT|Plastic flowers|10|4.99|Fragile handle with care,ITEM202-RR|Fertilizer|1|10.99|Lawn fertilizer,ITEM453-XS|Weed killer|1|5.99|Lawn weed killer|1999-05-25
Der Austausch oder das Bestellungsdokument verfügt über einen Header, der den Typ der enthaltenen Dokumente angibt:
Northwind Shipping
Batch type:Purchase Orders
Dieser Austausch besteht aus drei Bestellungsdokumenten. Eine Instanz besteht aus den nachfolgend aufgeführten Informationen. Wie Sie sehen, enthält er Informationen wie Rechnungs- und Lieferanschrift sowie die Liste der bestellten Artikel.
PO1999-10-20
US Alice Smith 123 Maple Street Mill Valley CA 90952
US Robert Smith 8 Oak Avenue Old Town PA 95819
Hurry, my lawn is going wild!
ITEMS,ITEM872-AA|Lawnmower|1|148.95|Confirm this is electric,ITEM926-AA|Baby Monitor|1|39.98|Confirm this is electric|1999-10-21
Der von uns hierfür zu erstellende Rechnungsaustausch sollte wie folgt aussehen:
Northwest Shipping
DocumentTypes:Invoices
INVOICE1999-10-20
BILLTO,US,Alice Smith,123 Maple Street,Mill Valley,CA,90952
872-AA Lawnmower 1 148.95 Confirm this is electric
926-AA Baby Monitor 1 39.98 Confirm this is electric
INVOICE1999-10-21
BILLTO,US,John Dow,123 Elm Street,Mill Valley,CA,90952
398-BB Tire 4 324.99 Wrap them up nicely
201-BB Engine Oil 1 12.99 SAE10W30
INVOICE1999-10-20
BILLTO,US,John Connor,123 Cedar Street,Mill Valley,CA,90952
101-TT Plastic flowers 10 4.99 Fragile handle with care
202-RR Fertilizer 1 10.99 Lawn fertilizer
453-XS Weed killer 1 5.99 Lawn weed killer
Dieser Austausch enthält eine Teilmenge der im Bestellungsaustausch enthaltenen Informationen. Das Format des Austauschs und das Format des Headers sind verschieden.
Der Header sieht folgendermaßen aus:
Northwest Shipping
DocumentTypes:Invoices
Und die Dokumentinstanz umfasst Folgendes:
INVOICE1999-10-20
BILLTO,US,Alice Smith,123 Maple Street,Mill Valley,CA,90952
872-AA Lawnmower 1 148.95 Confirm this is electric
926-AA Baby Monitor 1 39.98 Confirm this is electric
Zuerst müssen Flatfile-Schemas für Folgendes erstellt werden:
Bestellungsdokument (PO.xsd)
Rechnungsdokument (Invoice.xsd)
Bestellungsheader (POHeader.xsd)
Rechnungsheader (InvoiceHeader.xsd)
Für dieses Beispiel wird das Erstellen von Flatfile-Schemas nicht erläutert. Informationen zum Erstellen von Flatfile-Schemas aus Dokumentinstanzen finden Sie im Dokumentationsabschnitt „Erstellen von Flatfile-Schemas aus einer Dokumentinstanz“.
Zuordnung zum Transformieren von Bestellungsdokumenten in Rechnungsdokumente
Die Zuordnung (PO2Invoice.btm) transformiert eine Instanz der Bestellung in ein Rechnungsdokument.
Empfangs- und Sendepipelines
Die Empfangspipeline (FFReceivePipeline.btp) enthält eine Flatfile-Disassemblerkomponente, mit der ein Bestellungsaustausch verarbeitet wird. Für den Austausch in der Datei CMPInput.txt wird insbesondere der Austauschheader entfernt und drei XML-Dokumente erstellt, die den drei Bestellungen entsprechen.
Der Flatfile-Disassembler in der Empfangspipeline ist wie folgt konfiguriert:
Dokumentschema: PipelinesAndSchemas.PO
Headerschema: PipelinesAndSchemas.POHeader
Kopfzeile beibehalten: FALSE
Wiederherstellbarer Austausch: FALSE
Trailerschema: (Keine)
Überprüfen der Dokumentstruktur: FALSE
Die Sendepipeline (FFSendPipeline.btp) enthält eine Flatfile-Assemblerkomponente, mit der aggregierte Rechnungsaustauschvorgänge erstellt werden.
Der Flatfile-Assembler in der Sendepipeline ist wie folgt konfiguriert:
Dokumentschema: PipelinesandSchemas.Invoice
Headerschema: PipelinesAndSchemas.InvoiceHeader
Bytereihenfolgenmarkierung beibehalten: FALSE
Zielzeichensatz: (Keine)
Trailerschema: (Keine)
Orchestrierungszeitplan
Im Orchestrierungszeitplan (CMP.odx) erfolgt die gesamte Hauptverarbeitung. Insbesondere die folgenden Aktionen werden ausgeführt:
Ausführen der Empfangspipeline zum Disassemblieren des Bestellungsaustauschs
Transformieren jeder Ausgabenachricht der Empfangspipeline
Ausführen der Sendepipeline zum Assemblieren eines Rechnungsaustauschs
Erstellen des Orchestrierungszeitplans und Definieren globaler Variablen
Unsere Orchestrierung erhält einen Flatfile-Austausch als Eingabe und sendet einen Flatfile-Austausch als Ausgabe. Daher müssen Eingabe- und Ausgabenachrichten (InputInterchange und OutputInterchange) als „typagnostisch“ definiert werden (d. h. sie besitzen den Typ System.Xml.XmlDocument).
Außerdem muss ein atomarischer Bereich festgelegt werden, in dem die Verarbeitung der Nachrichten erfolgt. Dieser ist erforderlich, da die Empfangspipeline innerhalb eines atomarischen Bereichs ausgeführt werden kann.
Ausführen der Empfangspipeline
Im nächsten Schritt wird die Logik hinzugefügt, um eine Empfangspipeline für die Nachricht auszuführen, die in der Orchestrierung empfangen wurde. Dazu wird zuerst eine Variable (RcvPipeOutput) vom Typ Microsoft.XLANGs.Pipeline.ReceivePipelineOutputMessages innerhalb des Bereichs deklariert. Diese Variable ist ein Enumerator, mit dem die Ausgabenachrichten der Empfangspipeline durchlaufen werden können. Beachten Sie, dass Sie für den Zugriff auf diesen sowie auf alle anderen Typen zur Ausführung von Pipelines der Orchestrierung Verweise zu folgenden Assemblys hinzufügen müssen:
Microsoft.XLANGs.Pipeline.dll
Microsoft.BizTalk.Pipeline.dll
Es gibt keine Garantie, dass die Empfangspipeline immer erfolgreich ausgeführt wird. Gelegentlich können falsche Nachrichten verwendet werden, was zu einem Fehler bei der Pipelineverarbeitung führt. Wenn die in der Orchestrierung ein Fehler bei der Ausführung der Pipeline auftritt, wird eine Ausnahme ausgelöst, die erfasst werden kann, woraufhin die Ausführung der Fehlerbehandlungslogik erfolgen kann. Damit die von der Pipeline ausgelöste Ausnahme erfasst werden kann, muss die Pipeline innerhalb eines nicht atomarischen Bereichs mit einer Ausnahmebehandlung ausgeführt werden. Der eigentliche Code zum Ausführen der Pipeline wird von einer Form vom Typ „Ausdruck“ innerhalb des Bereichs aufgerufen.
Schreiben Sie in der ExecuteRcvPipe-Form vom Typ „Ausdruck“ die folgende Codezeile, um die Empfangspipeline auszuführen:
RcvPipeOutput = Microsoft.XLANGs.Pipeline.XLANGPipelineManager.ExecuteReceivePipeline(typeof(PipelinesAndSchemas.FFReceivePipeline), InputInterchange);
Es folgt eine ausführlichere Analyse dieser Codezeile. Wie Sie sehen können, wird die statische Methode ExecuteReceivePipeline, die eine Art von auszuführender Empfangspipeline und eine Eingabenachricht als Parameter übernimmt. Als Ergebnis wird ein Enumeratorobjekt mit dem Satz der Ausgabenachrichten erstellt. Das Ergebnis wird einer Variablen vom Typ ReceivePipelineOutputMessages zugeordnet, die zuvor in diesem Bereich definiert wurde.
Außerdem wurde ein Block zur Ausnahmebehandlung für den Pipelineausführungsbereich einbezogen. Dieser Block erfasst die Ausnahme vom Typ XLANGPipelineManagerException und beendet dann der Einfachheit halber eine Orchestrierungsinstanz mit einer benutzerdefinierten Fehlermeldung.
In komplexeren Szenarien kann hier eine zusätzliche Fehlerbehandlung erfolgen, z. B. die Generierung der Nachricht zur Fehlerbenachrichtigung und das anschließende Senden dieser Nachricht per E-Mail an einen geschäftlichen Benutzer oder Administrator.
Transformieren von Pipelineausgabenachrichten
Nachdem die Pipeline ausgeführt und der Satz disassemblierter Nachrichten erzeugt wurde, müssen die einzelnen Ausgabenachrichten in ein anderes Format transformiert werden.
Damit die Transformation in der Orchestrierung verwendet werden kann, müssen zwei Nachrichten definiert werden – Transformationseingabe und -ausgabe. Diese Nachrichten werden innerhalb des atomarischen Bereichs definiert. Die Transformationseingabenachricht namens TmpMessageIn hat den Typ PipelinesAndSchemas.PO. Die Transformationsausgabenachricht namens TmpMessageOut hat den Typ PipeliensAndSchemas.Invoice. Wir wenden die Karte PO2Invoice.btm an, die im Projekt PipelinesAndSchemas definiert ist.
Da jede Pipelineausgabenachricht zugeordnet werden soll, muss die Transformation in einer Schleife ausgeführt werden. Es wird eine Form vom Typ „Schleife“ mit einer Beendigungsbedingung verwendet, wie nachfolgend veranschaulicht:
RcvPipeOutput.MoveNext()
Die MoveNext()-Methode ist eine Standardmethode der .NET-Schnittstelle IEnumerator, die eine Verschiebung innerhalb der Auflistung der Ausgabenachrichten der Pipeline gestattet. Wenn das Ende der Auflistung erreicht ist, gibt die Methode „Falsch“ zurück.
Die erste Form vom Typ „Erstellen“ wird dazu verwendet, um eine Orchestrierungsnachricht TmpMessageIn außerhalb der Pipelineausgabenachricht zu erstellen.
Der Code in der Form „Erstellen“:
TmpMessageIn = null;
RcvPipeOutput.GetCurrent(TmpMessageIn);
In diesem Code wird die Orchestrierungsnachricht zuerst mit NULL initialisiert und dann wird für sie die aktuelle Nachricht aus der Auflistung der Pipelineausgabenachrichten festgelegt.
In der zweiten Form vom Typ „Erstellen“ wird die eigentliche Transformationen von TmpMessageIn ausgeführt und TmpMessageOut vom Typ PipelinesAndSchemas.Invoice erstellt.
Ausführen der Sendepipeline
Der letzte Verarbeitungsschritt der Orchestrierung umfasst die Ausführung der Flatfile-Sendepipeline, um alle transformierten XML-Nachrichten in einen Flatfile-Austausch zu assemblieren.
Zum Ausführen einer Sendepipeline muss eine Variable vom Typ Microsoft.XLANGs.Pipeline.SendPipelineInputMessages mit der Bezeichnung SendPipeInput verwendet werden, die eine Auflistung von Orchestrierungsnachrichten aufnimmt, die in einer Sendepipeline verarbeitet werden müssen.
Im letzten Ausdruck der Schleife, in dem die Transformation ausgeführt wurde, wird ein Code geschrieben, der die einzelnen transformierten Nachrichten in eine Nachrichtenauflistung für die Sendepipeline hinzufügt:
SendPipeInput.Add(TmpMessageOut);
Ähnlich wie beim Ausführen der Empfangspipeline wird der Code zum Ausführen der Sendepipeline innerhalb eines nicht atomarischen Bereichs mit einem Block zur Ausnahmebehandlung positioniert. Der Ausführungscode für die Sendepipeline befindet sich in der Form vom Typ „Nachrichtenzuweisung“ des Erstellungsblocks.
OutputInterchange = null;
Microsoft.XLANGs.Pipeline.XLANGPipelineManager.ExecuteSendPipeline(typeof(PipelinesAndSchemas.FFSendPipeline), SendPipeInput, OutputInterchange);
Der Erstellungsblock wird zum Erstellen der typagnostischen (z. B. System.Xml.XmlDocument) Pipelineausgabenachricht OutputInterchange verwendet. Dann wird die neu erstellte Nachricht in der Form vom Typ „Nachrichtenzuweisung“ mit NULL initialisiert. Anschließend wird die statische Methode ExecuteSendPipeline aufgerufen, um eine Sendepipeline auszuführen. Bei dieser Methode wird als Parameter ein Typ der auszuführenden Sendepipeline, die Eingabenachricht und der Verweis auf die Ausgabenachricht verwendet, wo die Pipelineausgabe gespeichert wird.
Wie bei der Ausführung der Empfangspipeline ist hier ebenfalls ein Block zur Ausnahmebehandlung für den Pipelineausführungsbereich vorhanden. Dieser Block erfasst die Ausnahme vom Typ XLANGPipelineManagerException und beendet dann der Einfachheit halber eine Orchestrierungsinstanz mit einer benutzerdefinierten Fehlermeldung.
Speicherort dieses Beispiels
In der folgenden Tabelle werden die Dateien für dieses Beispiel aufgelistet.
Datei(en) | BESCHREIBUNG |
---|---|
Cleanup.bat | Wird verwendet, um die Bereitstellung von Assemblys aufzuheben und sie aus dem globalen Assemblycache (GAC) zu entfernen. Entfernt Sende- und Empfangsports. Entfernt nach Bedarf virtuelle Verzeichnisse von Microsoft Internetinformationsdienste (IIS). |
ComposedMessageProcessor.sln | Visual Studio-Projektdatei für das Beispiel. |
ComposedMessageProcessorBinding.xml | Bindungsdatei für das Beispiel. |
Setup.bat | Dient zum Erstellen und Initialisieren dieses Beispiels. |
In Orchestrierungsordner: CMP.odx |
Die Orchestrierung, die die Empfangspipeline zum Disassemblieren der Nachricht ausführt, transformiert jede disassemblierte Nachricht und führt dann die Sendepipeline aus, um die Nachrichten in einen Austausch zu assemblieren. |
In Orchestrierungsordner: Orchestration.btproj |
BizTalk-Projekt für die Orchestrierung. |
In Orchestrierungsordner: SuspendMessage.odx |
Die Orchestrierung, die zum Anhalten von Nachrichten verwendet wird, bei denen ein Fehler bei der Pipelineverarbeitung auftritt. |
Im Ordner PipelinesAndSchemas: CMPInput.xml, CMPOutput.xml |
Eingabe- und Ausgabedokumentinstanzen für das Beispiel. |
Im Ordner PipelinesAndSchemas: FFReceivePipeline.btp, FFSendPipeline.btp |
Empfangs- und Sendepipeline mit Flatfile-Komponenten. Diese Pipelines werden innerhalb der Orchestrierung ausgeführt. |
Im Ordner PipelinesAndSchemas: Invoice.xsd, InvoiceHeader.xsd |
Flatfile-Schemas für das Ausgabedokument und den Header. |
Im Ordner PipelinesAndSchemas: PO.xsd, POHeader.xsd |
Flatfile-Schemas für das Eingabedokument und den Header. |
Im Ordner PipelinesAndSchemas: PropertySchema.xsd |
Eigenschaftenschema für das Beispiel. |
Erstellen und Initialisieren des Beispiels
Mithilfe des folgenden Verfahrens können Sie das Beispiel „Compose“ erstellen und initialisieren.
So erstellen und initialisieren Sie das Beispiel „Compose“
Navigieren Sie in einem Befehlsfenster zum folgenden Ordner:
<Samples Path>\Pipelines\ComposedMessageProcessor
Führen Sie die Datei "Setup.bat" aus, von der folgende Aktionen ausgeführt werden:
Erstellen der Eingabeordner (In) und der Ausgabeordner (Out) für dieses Beispiel im folgenden Ordner:
<Samples Path>\Pipelines\ComposedMessageProcessor
Kompilieren der Visual Studio-Projekte für dieses Beispiel.
Erstellen einer neuen Anwendung namens „CMP Sample“ und Bereitstellen der Beispielassemblys in dieser Anwendung.
Erstellen und Binden des BizTalk Server-Empfangsspeicherorts sowie der Sende- und Empfangsports.
Eintragen und Starten der Orchestrierung, Aktivieren des Empfangsspeicherorts und Starten des Sendeports.
Wenn Sie die Projekte in diesem Beispiel öffnen und erstellen möchten, ohne die Datei Setup.bat auszuführen, müssen Sie zunächst ein Schlüsselpaar mit starkem Namen mit dem entsprechenden .NET Framework-Hilfsprogramm für starke Namen (sn.exe) erstellen. Verwenden Sie dieses Schlüsselpaar zum Signieren der sich ergebenden Assemblys.
Bevor Sie versuchen, dieses Beispiel ausführen, sollten Sie sicherstellen, dass BizTalk Server während des Erstellungs- und Initialisierungsvorgangs keine Fehler gemeldet hat.
Sie müssen folgende Schritte ausführen, um die von Setup.bat vorgenommenen Änderungen rückgängig zu machen:
Beenden Sie die Hostinstanz über die BizTalk Server-Verwaltungskonsole, und starten Sie sie dann neu.
Führen Sie die Datei Cleanup.bat aus. "Cleanup.bat" müssen Sie ausführen, bevor "Setup.bat" ein zweites Mal ausgeführt wird.
Ausführen des Beispiels
Gehen Sie zum Ausführen des Beispiels „ComposedMessageProcessor“ wie folgt vor:
So führen Sie das Beispiel „ComposedMessageProcessor“ aus
Kopieren Sie die Textdatei CMPInput.txt, die sich im Ordner PipelinesAndSchemas befindet. Fügen Sie die Datei in den Ordner In ein.
Beobachten Sie die im Ordner Out erstellte Textdatei. Diese Datei enthält die gleichen Datensätze wie die CMPInput.txt, aber das Format der Daten in der Datei ist unterschiedlich.
Folgendes geschieht, während die Nachricht BizTalk Server durchläuft:
Die Nachricht wird disassembliert und in XML-Nachrichten konvertiert. Jede Nachricht wird einem anderen Format zugeordnet.
Alle zugeordneten Nachrichten werden zusammen assembliert und in das Flatfileformat konvertiert.