Die BizTalk Server-Nachricht
BizTalk Server ist im Kern eine Engine für die Nachrichtenverarbeitung. Um die Details von BizTalk Server zu verstehen, ist es wichtig, Nachrichten zu verstehen und zu verstehen, wie sie von BizTalk Server dargestellt, gespeichert und verarbeitet werden. Wenn Sie sich eine Vorstellung davon gemacht haben, was eine Nachricht eigentlich ist, fällt es Ihnen leichter nachzuvollziehen, wie BizTalk Server mit Nachrichten arbeitet.
Jede Nachricht wird in BizTalk Server als mehrteilige Nachricht betrachtet, die aus null oder mehr Teilen besteht. In jeder Nachricht mit einem oder mehreren Teilen wird ein Teil als Textteil gekennzeichnet. Jeder Teil umfasst ein Binärsegment von Daten, die ein XML-Dokument, eine Flatfile, eine serialisierte .NET-Klasse oder einen anderen Binärstrom von Daten darstellen können. Anhand des Textteils der Nachricht können Sie den Nachrichtentyp bestimmen, der für das Routing verwendet werden kann.
Ein sehr wichtiges Konzept zu verstehen ist, dass alle Nachrichten in BizTalk Server unveränderlich sind. Das heißt, eine Nachricht kann nach dem Erstellen nicht mehr verändert werden. Eine Nachricht wird als erstellt betrachtet, wenn sie in der MessageBox-Datenbank abgelegt wurde. Sollen Änderungen an der Nachricht vorgenommen werden, muss eine neue Nachricht erstellt und von diesem Punkt an verwendet werden. Besonders deutlich wird dies im Orchestrierungs-Designer. Hier werden Sie durch Kompilierungsregeln gezwungen, sich beim Erstellen einer Nachricht an strikte Richtlinien zu halten, bevor Sie die Nachricht verwenden können. Außerhalb ihres Erstellungsblocks kann eine Nachricht nicht geändert werden. Sind Änderungen erforderlich, müssen Sie einen neuen Erstellungsblock erzeugen, in dem eine Nachricht desselben Typs erstellt wird. Dann müssen Sie die Originalnachricht in die neue Nachricht kopieren und alle erforderlichen Änderungen an der neuen Nachricht vornehmen, bevor Sie den Erstellungsblock verlassen.
Nachrichteneigenschaften
Zusätzlich zu den Teilen, aus denen eine Nachricht besteht, verfügt jede Nachricht im System über einen Satz von Eigenschaften, die mit ihr im sogenannten Nachrichtenkontext einhergehen. Diese Eigenschaften können Werte sein, die aus der Nachricht extrahiert wurden oder sich darauf beziehen. Adapter beispielsweise tragen Eigenschaften in den Kontext ein, die sich auf den Empfang einer Nachricht beziehen (z. B. den Speicherort, an dem die Nachricht empfangen wurde, und den Typ des Adapters, mit dem die Nachricht empfangen wurde). Eigenschaften können entweder in den Kontext geschrieben oder in den Kontext heraufgestuft werden. Im Gegensatz zu geschriebenen Eigenschaften können höher gestufte Eigenschaften als Kriterien bei der Nachrichtenweiterleitung verwendet werden.
Dieses Konzept des Schreibens oder Heraufstufens von Werten in den Kontext ist verwandt (jedoch nicht identisch) mit dem Heraufstufen von Eigenschaften im BizTalk-Editor. Im BizTalk-Editor kann ein Element oder Attribut in einem Schema als höher gestufte Eigenschaft oder gekennzeichnetes Feld markiert werden. Elemente, die mit "PropertyField"-Anmerkungen im Nachrichtenschema markiert sind, führen zum Disassembler der Pipeline und fügen dem Kontext eine Eigenschaft "Promoted" hinzu. Elemente, die mit "DistinguishedField"-Anmerkungen im Nachrichtenschema markiert sind, führen zum Disassembler der Pipeline und fügen dem Kontext eine Eigenschaft "Written" hinzu.
Der Entwurf für heraufgestufte Eigenschaften begann mit dem Entwurf der Nachrichtenkorrelation: Die Möglichkeit, eine empfangene Nachricht mit einer bereits ausgeführten Orchestrierung instance zu verknüpfen. Für die Korrelation muss eine Eigenschaft oder eine Gruppe von Eigenschaften definiert werden, die eine Verbindung zwischen Nachrichten in der Orchestrierung ermöglichen. Bei einem Einkaufsvorgang müssen Sie beispielsweise Nachrichten anhand der "PurchaseOrderID" korrelieren. In vielen Geschäftssituationen kann es jedoch vorkommen, dass der Name des jeweiligen Felds oder Attributs in der Nachricht nicht übereinstimmt. Ein Bestellungsschema kann ein Element namens "POId" enthalten, während das dazugehörige Rechnungsschema möglicherweise ein Element namens "OrderID" enthält. Um die Nachrichten für eine benannte Eigenschaft wie "PurchaseOrderID" in dieser Situation zu korrelieren, muss der Entwickler in der Lage sein, den Namen der Eigenschaft so zu abstrahieren, dass er aus der Quelle des Werts korreliert werden kann. Eigenschaftenschemas unterstützen diese Abstraktion.
Mit einem Eigenschaftenschema können Sie höhergestufte Eigenschaften an einem gemeinsamen Speicherort definieren und von anderen Schemas referenzieren lassen. Genau wie andere Schemas hat auch ein Eigenschaftsschema einen Namespace, im Gegensatz zu anderen Schemas kann es jedoch nur über definierte Elemente verfügen (das heißt, keine Datensätze oder Attribute). Jedes Element, das im Eigenschaftsschema definiert ist, hat einen Namen und einen Typ. Da es mehr als einem Schema möglich sein muss, auf das Eigenschaftsschema zu verweisen, und da die im Eigenschaftsschema enthaltenen Informationen zur Laufzeit für Komponenten verfügbar sein müssen, muss das Eigenschaftsschema wie alle anderen Schemas in BizTalk Server bereitgestellt werden. Zusätzlich zu den normalen Schemabereitstellungsschritten werden Informationen zu den höhergestuften Eigenschaften extrahiert und in der tabelle bt_documentSpec in der Verwaltungsdatenbank gespeichert.
Nach dem Erstellen eines Eigenschaftsschemas können Elemente und Attribute mit demselben Typ (z. B. Ganzzahl) als eine der im Eigenschaftsschema benannten Eigenschaften höher gestuft werden.
Um das obige Beispiel abzuschließen, würde ein Entwickler die folgenden Schritte ausführen, mit denen die für die Korrelation erforderliche freigegebene Eigenschaft definiert werden kann.
Erstellen eines Eigenschaftsschemas und Definieren eines Elements vom Typ "xs:int" namens "PurchaseOrderId".
Erstellen eines Schemas "PurchaseOrder" und Hinzufügen eines Elements oder Attributs vom Typ "xs:int" namens "POId".
Mithilfe des Befehls "Heraufstufungen anzeigen" im BizTalk-Editor fügt der Entwickler der Liste mit den höher gestuften Eigenschaften das Feld „POId“ hinzu und gibt an, dass es als Eigenschaft "PurchaseOrderId", die im Eigenschaftsschema definiert ist, höher gestuft werden soll. Dazu wird die Eigenschaft "PurchaseOrderId" in der Liste ausgewählt.
Erstellen eines Schemas "Invoice" und Hinzufügen eines Elements oder Attributs vom Typ "xs:int" namens "OrderId".
Mithilfe des Befehls "Heraufstufungen anzeigen" im BizTalk-Editor fügt der Entwickler der Liste der höher gestuften Eigenschaften das Feld "OrderId" hinzu und gibt an, dass es als Eigenschaft "PurchaseOrderId", die im Eigenschaftsschema definiert ist, höher gestuft werden soll. Hierzu wählt er die Eigenschaft namens "PurchaseOrderId" in der Liste aus.
Da diese Definition nun im Dokumentschema existiert, können Pipelinekomponenten "OrderId" und "POId" als benannte Eigenschaft "PurchaseOrderID" ordnungsgemäß höher stufen, sodass diese für Routing- und Korrelationszwecke verwendet werden kann. Weitere Informationen zu diesem Heraufstufungsprozess finden Sie im Abschnitt "Nachrichtenverarbeitung" in diesem Dokument.
Einer der Vorteile von höher gestuften Eigenschaften besteht darin, dass der Wert des Elements, das höher gestuft wird, im Kontext der Nachricht verfügbar ist. Dies bedeutet, das Abrufen dieses Wertes ist ein unaufwändiger Vorgang. Es ist nicht erforderlich, die Nachricht in den Arbeitsspeicher zu laden, um eine XPath-Anweisung dafür auszuführen. Stattdessen kann der Wert mithilfe einer einfachen Eigenschaftssammlung zusammen mit einem Schlüssel abgerufen werden. Aufgrund dieses Verhaltens, das in anderen Situationen als der Nachrichtenweiterleitung erwünscht ist, werden gekennzeichnete Felder erstellt. Höher gestufte Eigenschaften werden in den Nachrichtenkontext höher gestuft, gekennzeichnete Felder hingegen werden in den Nachrichtenkontext geschrieben. Im Gegensatz zu höher gestuften Eigenschaften gibt es für gekennzeichnete Felder kein Eigenschaftsschema. Aus diesem Grund können gekennzeichnete Felder nicht für das Routing verwendet werden und stehen daher nicht als Filterkriterien in einem Sendeport oder einer Form vom Typ "Empfangen" einer Orchestrierung zur Verfügung. Gekennzeichnete Felder können jedoch in Orchestrierungen verwendet werden, um Werte aus dem Nachrichtenkontext zu lesen oder zu schreiben (anstatt die Nachricht in den Arbeitsspeicher zu laden und den Wert extrahieren zu müssen).
Neben dem Heraufstufen oder Schreiben von Eigenschaften in den Nachrichtenkontext haben Sie die Möglichkeit, dem Kontext Nachrichtenprädikate hinzuzufügen. Nachrichtenprädikate werden als Sicherheitsmaßnahme in BizTalk Server eingesetzt und bieten Kontextinformationen zur Nachricht. Diese Informationen müssen mit den Werten übereinstimmen, die für jeden Host festgelegt wurden, an den die Nachricht weitergeleitet wird. Diese Sicherheitsmaßnahme ermöglicht es Ihnen, Ihre BizTalk Server-Umgebung so zu konfigurieren, dass nur bestimmte Hosts bestimmte Nachrichten empfangen und verarbeiten dürfen. Ein Beispiel: In der BizTalk Server-Verwaltungskonsole kann ein Host mit dem Fingerabdruck eines Zertifikats konfiguriert werden, das für die Decodierung und -Entschlüsselung von Nachrichten verwendet werden soll. Durch Konfigurieren dieser Eigenschaft wird eine Anwendungseigenschaft für diesen Host in der MessageBox erstellt. Sichere Nachrichten, die mit diesem Fingerabdruck empfangen und entschlüsselt werden, werden dann nur an die Hosts weitergeleitet, für die der Fingerabdruck konfiguriert wurde.