Hinzufügen von Steuerungsfunktionen in Aktionen zum Optimieren der Ausführung von Regeln mithilfe von Microsoft Rules Composer (Vorschau)
Gilt für: Azure Logic Apps (Standard)
Wichtig
Diese Funktion befindet sich in der Vorschauphase und unterliegt den Zusätzlichen Nutzungsbedingungen für Microsoft Azure-Vorschauversionen.
In diesem Leitfaden wird beschrieben, wie Sie die Ausführung von Regeln optimieren, indem Sie in Ihren Regeln Aktionen mithilfe des Microsoft Rules Composer Steuerungsfunktionen hinzufügen. Steuerfunktionen unterstützen Ihre Anwendung oder Ihren Regelsatz dabei, die Fakten im Arbeitsspeicher der Regel-Engine zu steuern. Diese Funktionen schließen die Funktionen Assert, Clear, Halt, Retract, RetractByType, Reassert und Update für das .NET-Objekt sowie die TypedXmlDocument-Entitäten ein, die Sie als Fakten verwenden. Die Existenz von Fakten im Arbeitsspeicher bildet die Grundlage für die Bedingungen, die die Engine auswertet, und die Aktionen, die ausgeführt werden.
Voraussetzungen
Das heruntergeladene und installierte Tool Microsoft Rules Composer
XML-Datei mit dem Regelsatz, an dem Sie arbeiten möchten
Geben Sie die Werte in den XML-Dokumenten an, auf die Sie im Fenster „RuleSet-Explorer“ verweisen, um Fakten hinzuzufügen. Alternativ können Sie einen Faktenersteller verwenden, um Ihrer Regel-Engine ein Array bereitzustellen, das .NET-Objekte als Fakten enthält. Weitere Informationen finden Sie unter Erstellen von Faktenerstellern und -abrufern.
Funktion „Assert“
Verwenden Sie die Assert-Funktion in Microsoft Rules Composer, um dem Arbeitsspeicher der Regel-Engine Objektinstanzen hinzuzufügen. Die Engine verarbeitet mithilfe der Übereinstimmungs-, Konfliktlösungs- und Aktionsphasen jede Objektinstanz entsprechend den Bedingungen und Aktionen, die für den jeweiligen Instanztyp geschrieben werden.
In der folgenden Tabelle ist das Verhalten der Assert-Funktion für die unterstützten eingefügten Entitäten und Instanztypen zusammengefasst, einschließlich der Anzahl der in der Engine für jede eingefügte Entität erstellten Instanzen und des Typs, der auf jede Instanz zur Identifizierung angewendet wurde.
Entity | Anzahl eingefügter Instanzen | Instanztyp |
---|---|---|
.NET-Objekt | 1 (das Objekt selbst) | Vollqualifizierte .NET-Klasse |
TypedXmlDocument | 1-N TypedXmlDocument(s): Basierend auf den erstellten Selektorbindungen und Dokumentinhalten | DocumentType.Selector |
Einfügen eines .NET-Objekts
Die Regel-Engine bietet native Unterstützung für .NET-Skalartypen und .NET-Objekte für Referenztypen. Von allen Verarbeitungstypen bieten eingefügte .NET-Objekte die einfachste Verarbeitung.
In Microsoft Rules Composer können Sie ein .NET-Objekt in einer Regel einfügen.
Laden Sie in Microsoft Rules Composer die XML-Datei, die den Regelspeicher enthält, an dem Sie arbeiten möchten.
Suchen Sie im Fenster RuleSet-Explorer die von Ihnen gewünschte Regel, und wählen Sie diese aus.
Fügen Sie im Bereich THEN unter Aktionen die integrierte Assert-Funktion als Aktion hinzu.
Wählen Sie im Fenster Fakten-Explorer .NET-Klassen aus.
Ziehen Sie auf der Registerkarte .NET-Klassen die Konstruktormethode für das von Ihnen gewünschte Objekt zum Argument in der Assert-Aktion.
Microsoft Rules Composer übersetzt die Konstruktormethode in der Regeldefinition in einen CreateObject-Aufruf.
Hinweis
Obwohl die Regel-Engine über eine CreateObject-Funktion verfügt, wird die Funktion in Microsoft Rules Composer nicht als separate Funktion angezeigt.
Jedes Objekt wird als separate Objektinstanz in den Arbeitsspeicher eingefügt. Das bedeutet, dass die Instanz durch jedes Prädikat analysiert wird, das auf den Objekttyp verweist, beispielsweise IF Object.Property = 1
. Die Instanz ist basierend auf den Ergebnissen der Regelbedingungen außerdem für Regelaktionen verfügbar, die auf den Typ verweisen.
Beispiel: Angenommen, Sie haben die folgenden Regeln:
Regel 1
IF A.Value = 1
THEN A.Status = "good"
Regel 2
IF B.Value = 1
THEN A.Status = "good"
In Regel 1 wird die Status-Eigenschaft lediglich für die A-Instanzen mit dem Wert 1 aktualisiert. Wenn die Bedingung in Regel 2 jedoch als TRUE ausgewertet wird, wird der Status für alle A-Instanzen aktualisiert. Wenn mehrere B-Instanzen vorhanden sind, werden die A-Instanzen jedes Mal aktualisiert, sobald die Bedingung für eine B-Instanz als TRUE ausgewertet wird.
Einfügen einer TypedXmlDocument-Entität
In Microsoft Rules Composer können Sie eine TypedXmlDocument-Entität innerhalb einer Regel einfügen.
Suchen Sie im Fenster RuleSet-Explorer die von Ihnen gewünschte Regel, und wählen Sie diese aus.
Fügen Sie im Bereich THEN unter Aktionen die integrierte Assert-Funktion als Aktion hinzu.
Wählen Sie im Fenster Fakten-Explorer XML-Schemas aus.
Ziehen Sie auf der Registerkarte XML-Schemas den von Ihnen gewünschten Knoten zum Argument in der Assert-Aktion.
Bei den XML-Dokumenten handelt es sich im Grunde um Text Die Feldwerte könnten jedoch ein beliebiger Typ sein, der auf dem bei der Erstellung der Regel angegebenen Typ basiert. Felder sind XPath-Ausdrücke, wodurch sie möglicherweise eine Knotenmenge zurückgeben. Das bedeutet, dass das erste Element in der Menge als Wert verwendet wird.
Wenn eine TypedXmlDocument-Entität als Fakt eingefügt wird, erstellt die Regel-Engine basierend auf den in der Regel definierten Selektoren untergeordnete TypedXmlDocument-Instanzen. Sie können Selektoren als eine Möglichkeit betrachten, um die Knoten in einem XML-Dokument zu isolieren, während Felder bestimmte Elemente innerhalb des Selektors identifizieren. Die Regel-Engine gruppiert alle Felder innerhalb eines Selektors als Objekt.
Selektoren sind außerdem XPath-Ausdrücke. Wenn Sie im Fakten-Explorer auf der Registerkarte XML-Schemas einen Knoten auswählen, füllt Microsoft Rules Composer automatisch die Eigenschaft XPath Selector für alle Knoten und die Eigenschaft XPath Field für alle Knoten, die keine untergeordneten Knoten enthalten. Alternativ können Sie gegebenenfalls eigene XPath-Ausdrücke für XPath Selector und XPath Field eingeben. Wenn der Selektor mehreren Teilen im XML-Dokument entspricht, werden mehrere Objekte dieses Typs in den Arbeitsspeicher der Regel-Engine eingefügt oder aus dem Arbeitsspeicher der Regel-Engine zurückgezogen.
Im selben Dokument können Sie mehrere Selektoren verwenden. Dadurch können Sie verschiedene Teile des Dokuments anzeigen. Beispiel: Angenommen, ein Abschnitt enthält die Bestellung und ein anderer die Lieferadresse. Beachten Sie jedoch, dass die erstellten Objekte durch die XPath-Zeichenfolge definiert werden, mit der sie erstellt wurden. Wenn Sie einen anderen XPath-Ausdruck verwenden, ist das Ergebnis eine eindeutige TypedXmlDocument-Entität, selbst wenn der Ausdruck im selben Knoten aufgelöst wird.
Angenommen, Sie haben den folgenden XML-Code:
<root>
<order customer="Joe">
<item name="router" quantity="10" cost="550" />
<item name="switch" quantity="3" cost="300" />
</order>
<order customer="Jane">
<item name="switch" quantity="1" cost="300" />
<item name="cable" quantity="23" cost="9.99" />
</order>
</root>
Wenn Sie den Selektor /root/order oder //order verwenden, werden dem Arbeitsspeicher der Engine die folgenden Objekte hinzugefügt:
Objekt 1
<order customer="Joe">
<item name="router" quantity="10" cost="550" />
<item name="switch" quantity="3" cost="300" />
</order>
Objekt 2
<order customer="Jane">
<item name="switch" quantity="1" cost="300" />
<item name="cable" quantity="23" cost="9.99" />
</order>
In jedem Selektor verweisen XPath-Ausdrücke auf die einzelnen Felder. Wenn Sie also den Selektor /root/order/item, //order/item oder //item verwenden, werden dem Arbeitsspeicher der Engine die folgenden Objekte mit zwei Elementen für „Joe“ und zwei Elementen für „Jane“ hinzugefügt:
<root>
<order customer="Joe">
</order>
<order customer="Jane">
</order>
</root>
Jedes Objekt kann auf drei Felder zugreifen: @name, @quantity und @cost. Sie können auf die übergeordneten Felder verweisen, weil das Objekt ein Verweis auf das ursprüngliche Dokument ist, z. B. ../@customer.
Unter der Haube kann die Regel-Engine einen Textfeldwert über die XmlConvert--Funktion in einen der unterstützten Typen konvertieren. Sie können diese Option angeben, indem Sie den Typ in Microsoft Rules Composer festlegen. Wenn eine Konvertierung nicht möglich ist, löst die Engine eine Ausnahme aus. Sie können die Typen bool und double lediglich als ihren jeweiligen Typ abrufen – als Zeichenfolgen oder Objekte.
Clear-Funktion
Verwenden Sie die Clear-Funktion in Microsoft Rules Composer, wenn Sie den Arbeitsspeicher und die Agenda für eine Regel-Engine-Instanz zurücksetzen möchten. Weitere Informationen zum Arbeitsspeicher und zur Agenda finden Sie unter Optimierung der Regel-Engine.
Zurücksetzen des Arbeitsspeichers und der Agenda für Ihre Regel-Engine
Suchen Sie im Fenster RuleSet-Explorer die Regel, in der Sie den Arbeitsspeicher und die Agenda für die Regel-Engine löschen möchten.
Fügen Sie im Bereich THEN unter Aktionen die integrierte Clear-Funktion als Aktion hinzu.
Die Clear-Funktion nimmt keine Argumente an.
Halt-Funktion
Verwenden Sie die Halt-Funktion in Microsoft Rules Composer, um die aktuelle Ausführung durch die Regel-Engine zu beenden.
Beenden der Regelsatzausführung
Suchen Sie im Fenster RuleSet-Explorer die Regel, in der Sie die Regelausführung beenden möchten, und wählen Sie diese aus.
Fügen Sie im Bereich THEN unter Aktionen die integrierte Halt-Funktion als Aktion hinzu.
Die Halt-Funktion verwendet ein einzelnes boolesches Argument. Wenn Sie den Wert als TRUE angeben, löscht die Regel-Engine die Agenda, die die ausstehenden Kandidatenregeln enthält.
Die Ruleset.Execute-Methode ist ein Wrapper um die RuleEngine.Execute-Methode und verwendet Code, der dem folgenden Code ähnelt:
RuleEngine.Assert(facts);
RuleEngine.Execute();
RuleEngine.Retract(facts);
Wenn Sie die Ruleset.Execute-Methode verwenden, um einen Regelsatz auszuführen, gibt die Regel-Engine die Kontrolle beim Ausführen der Halt-Funktion an die Ruleset.Execute-Methode zurück. Die Ruleset.Execute-Methode zieht die Fakten zurück und gibt die Kontrolle an den Aufrufer zurück. In diesem Fall kann die angehaltene Regelsatzausführung nicht fortgesetzt werden.
Wenn Sie jedoch die RuleEngine.Execute-Methode zum Ausführen des Regelsatzes direkt verwenden, können Sie die Ausführung des angehaltenen Regelsatzes fortsetzen, indem Sie RuleEngine.Execute erneut aufrufen. Das ist lediglich dann möglich, wenn Sie keine Objekte zurückgezogen haben, die zwischen den beiden Aufrufen erforderlich sind.
Hinweis
Für eine bessere Leistung werden die Regel-Engine-Instanzen durch die Ruleset.Execute-Methode zwischengespeichert. Wenn Sie die RuleEngine.Execute-Methode direkt verwenden, werden die Regel-Engine-Instanzen nicht zwischengespeichert.
Der folgende Beispielcode veranschaulicht, wie die Ausführung des angehaltenen Regelsatzes fortgesetzt wird:
// Assert facts into working memory of the rules engine instance.
RuleEngine.Assert(facts);
// Execute the ruleset.
RuleEngine.Execute();
// The ruleset invokes the Halt method when executing actions.
// Control returns here when the Halt function is called.
// When engine halts, do the following tasks.
// Add your code here.
// Resume the halted rules engine execution.
RuleEngine.Execute();
// Retract or remove facts from working memory in the rules engine.
RuleEngine.Retract(facts);
Retract-Funktion
Verwenden Sie die Retract-Funktion in Microsoft Rules Composer, um Objekte aus einem Regelsatz und dem Arbeitsspeicher der Regel-Engine zu entfernen.
Zurückziehen eines .NET-Objekts
Suchen Sie im Fenster RuleSet-Explorer die von Ihnen gewünschte Regel, und wählen Sie diese aus.
Fügen Sie im Bereich THEN unter Aktionen die integrierte Retract-Funktion als Aktion hinzu.
Wählen Sie im Fenster Fakten-Explorer .NET-Klassen aus.
Ziehen Sie auf der Registerkarte .NET-Klassen die von Ihnen gewünschte Klasse – nicht die Assembly oder Methode – in das Argument für den Retract-Parameter.
Wenn Sie eine Methode in die Retract-Funktion ziehen, versucht die Engine, das von der Methode zurückgegebene Objekt zurückzuziehen.
Das Zurückziehen eines .NET-Objekts hat die folgenden Auswirkungen:
Aktionen in der Agenda, die die Objekte verwenden, werden aus der Agenda entfernt.
Hinweis
Andere Aktionen, die weiter oben in der Agenda liegen, wurden möglicherweise bereits ausgeführt, bevor Sie die Retract-Funktion verwenden.
Aktionen von Regeln, die das Objekt in einem Prädikat verwenden, werden aus der Agenda entfernt, sofern Aktionen in der Agenda vorhanden sind.
Die Engine wertet das Objekt nicht mehr aus.
Zurückziehen einer oder mehrerer TypedXmlDocument-Entitäten
Sie können die ursprüngliche TypedXmlDocument-Entität zurückziehen, die in die Regel-Engine eingefügt wurde. Alternativ können Sie eine der untergeordneten TypedXmlDocument-Entitäten zurückziehen, die aus der übergeordneten XmlDocument-Entität erstellt wurden.
Angenommen, Sie haben das folgende XML-Beispiel:
<order>
<orderline customer="Joe" linenumber="001">
<product name="router" quantity="10" cost="550" />
</orderline>
<orderline customer="Jane" linenumber="002">
<product name="switch" quantity="1" cost="300" />
</orderline>
</order>
Sie können die TypedXmlDocument-Entität zurückziehen, die einem order-Objekt zugeordnet ist. Alternativ können Sie eine oder beide TypedXmlDocument-Entitäten zurückziehen, die dem orderline-Objekt zugeordnet sind. Alle TypedXmlDocument--Entitäten sind der übergeordneten TypedXmlDocument-Entität zugeordnet, die ursprünglich eingefügt wurde. Sie sind jedoch nicht der TypedXmlDocument-Entität zugeordnet, die in der XML-Strukturhierarchie über dem übergeordneten TypedXmlDocument-Knoten angezeigt wird.
Beispiel: product ist eine TypedXmlDocument-Entität unterhalb des orderline-Objekts und der TypedXmlDocument-Entität für order zugeordnet. Sie ist jedoch nicht der TypedXmlDocument-Entität für orderline zugeordnet. In den meisten Fällen ist diese Unterscheidung nicht wichtig. Wenn Sie jedoch das order-Objekt zurückziehen, werden die Objekte orderline und product ebenfalls zurückgezogen. Wenn Sie das orderline-Objekt zurückziehen, wird lediglich dieses Objekt und nicht das product-Objekt zurückgezogen.
Die Engine funktioniert ausschließlich mit Objektinstanzen und verfolgt ausschließlich Objektinstanzen nach, bei denen es sich um TypedXmlDocument-Instanzen handelt, die die Engine beim ursprünglichen Einfügen der TypedXmlDocument-Entität erstellt hat. Wenn Sie zusätzliche Knoten erstellen, werden diese Knoten nur dann in Regeln ausgewertet, wenn für sie TypedXmlDocument-Entitäten erstellt und eingefügt werden. Bei diesen zusätzlichen Knoten könnte es sich beispielsweise um gleichgeordnete Knoten für einen Knoten handeln, der über einen Selektor im Regelsatz ausgewählt wurde. Wenn Sie diese neuen TypedXmlDocument-Instanzen einfügen, wertet die Engine die Instanzen in den Regeln aus. Das geschieht jedoch ohne das Wissen der übergeordneten TypedXmlDocument-Entität. Wenn die übergeordnete TypedXmlDocument-Entität zurückgezogen wird, werden die neuen, unabhängig eingefügten TypedXmlDocument-Entitäten nicht automatisch zurückgezogen. Führen Sie daher auf der vollständigen XmlDocument-Entität eine Retract- und Reassert-Funktion aus. Dabei handelt es sich um den üblichen und einfachsten Schritt.
Die TypedXmlDocument-Klasse bietet hilfreiche Methoden, die Sie innerhalb eines benutzerdefinierten .NET-Members als Teil einer Aktion aufrufen können. Diese Methoden schließen die Möglichkeit ein, die XmlNode-Entität abzurufen, die der TypedXmlDocument-Entität oder der übergeordneten TypedXmlDocument-Entität zugeordnet ist.
Zurückziehen der übergeordneten TypedXmlDocument-Entität
Suchen Sie im Fenster RuleSet-Explorer die von Ihnen gewünschte Regel, und wählen Sie diese aus.
Fügen Sie im Bereich THEN unter Aktionen die integrierte Retract-Funktion als Aktion hinzu.
Wählen Sie im Fenster Fakten-Explorer XML-Schemas aus.
Ziehen Sie auf der Registerkarte XML-Schemas den übergeordneten Knoten für das Schema in das Argument für die Retract-Funktion.
Dieser übergeordnete Knoten endet mit der Dateierweiterung .xsd und stellt den Dokumentstammknoten und nicht den Dokumentelementknoten dar. Der Knoten verfügt über einen /-Selektor, der auf die ursprüngliche TypedXmlDocument-Entität verweist. Wenn Sie die übergeordnete TypedXmlDocument-Entität zurückziehen, werden alle untergeordneten TypedXmlDocument-Entitäten, die der TypedXmlDocument-Entität zugeordnet sind, aus dem Arbeitsspeicher entfernt. Dazu zählen alle TypedXmlDocument-Entitäten, die basierend auf den im Regelsatz verwendeten Selektoren durch den Aufruf der Assert-Funktion erstellt wurden.
Zurückziehen einer untergeordneten TypedXmlDocument-Entität
Suchen Sie im Fenster RuleSet-Explorer die von Ihnen gewünschte Regel, und wählen Sie diese aus.
Fügen Sie im Bereich THEN unter Aktionen die integrierte Retract-Funktion als Aktion hinzu.
Wählen Sie im Fenster Fakten-Explorer XML-Schemas aus.
Ziehen Sie auf der Registerkarte XML-Schemas den untergeordneten Knoten in das Argument für die Retract-Funktion.
RetractByType-Funktion
Verwenden Sie die RetractByType-Funktion in Microsoft Rules Composer, um alle Objekte mit dem angegebenen Typ aus dem Arbeitsspeicher der Regel-Engine zu entfernen. Diese Funktion unterscheidet sich von der Retract-Funktion, die lediglich bestimmte Elemente mit einem bestimmten Typ entfernt.
Zurückziehen aller .NET-Objekte mit einem bestimmten Typ
Suchen Sie im Fenster RuleSet-Explorer die von Ihnen gewünschte Regel, und wählen Sie diese aus.
Fügen Sie im Bereich THEN unter Aktionen die integrierte RetractByType-Funktion als Aktion hinzu.
Wählen Sie im Fenster Fakten-Explorer .NET-Klassen aus.
Ziehen Sie auf der Registerkarte .NET-Klassen die Klasse in das Argument für die RetractByType-Funktion.
Zurückziehen aller TypedXmlDocument-Entitäten mit einem bestimmten Typ
Die RetractByType-Funktion entfernt alle TypedXmlDocument-Entitäten mit demselben DocumentType.Selector-Typ.
Suchen Sie im Fenster RuleSet-Explorer die von Ihnen gewünschte Regel, und wählen Sie diese aus.
Fügen Sie im Bereich THEN unter Aktionen die integrierte RetractByType-Funktion als Aktion hinzu.
Wählen Sie im Fenster Fakten-Explorer XML-Schemas aus.
Ziehen Sie auf der Registerkarte XML-Schemas den entsprechenden Knoten zur RetractByType-Funktion.
In Übereinstimmung mit der Retract-Funktion zieht diese Aktion nicht nur alle TypedXmlDocument-Entitäten zurück, die mit diesem DocumentType-Objekt eingefügt wurden, sondern auch alle untergeordneten TypedXmlDocument-Entitäten oder XmlNode-Knoten in der Strukturhierarchie, die diesen übergeordneten TypedXmlDocument-Entitäten zugeordnet sind, wenn Sie die RetractByType-Funktion auf dem Stammknoten des Dokuments verwenden.
Reassert-Funktion
Verwenden Sie die Reassert-Funktion in Microsoft Rules Composer, um die Assert-Funktion für ein Objekt aufzurufen, das bereits im Arbeitsspeicher der Engine vorhanden ist. Das Verhalten entspricht dem Ausstellen eines Retract-Befehls für das Objekt, gefolgt von einem Assert-Befehl.
Beispiel: Wenn Sie die Reassert-Funktion für ein .NET-Objekt verwenden, führt die Regel-Engine die folgenden Schritte aus:
Das .NET-Objekt wird aus dem Arbeitsspeicher zurückgezogen.
Alle Aktionen in der Agenda werden für Regeln entfernt, die das Objekt in einem Prädikat oder einer Aktion verwenden.
Das .NET-Objekt wird zurück in den Arbeitsspeicher eingefügt, und es wird als neu eingefügtes Objekt ausgewertet.
Alle Regeln, die das Objekt in einem Prädikat verwenden, werden erneut ausgewertet, und die Aktionen dieser Regeln werden der Agenda hinzugefügt.
Die Aktionen werden der Agenda für alle Regeln erneut hinzugefügt, die zuvor als TRUE ausgewertet wurden und in ihren Aktionen ausschließlich das Objekt verwenden.
Erneutes Einfügen eines .NET-Objekts
Suchen Sie im Fenster RuleSet-Explorer die von Ihnen gewünschte Regel, und wählen Sie diese aus.
Fügen Sie im Bereich THEN unter Aktionen die integrierte Reassert-Funktion als Aktion hinzu.
Wählen Sie im Fenster Fakten-Explorer .NET-Klassen aus.
Ziehen Sie auf der Registerkarte .NET-Klassen die Klasse in das Argument für die Reassert-Funktion.
Erneutes Einfügen einer TypedXmlDocument-Entität
Suchen Sie im Fenster RuleSet-Explorer die von Ihnen gewünschte Regel, und wählen Sie diese aus.
Fügen Sie im Bereich THEN unter Aktionen die integrierte Reassert-Funktion als Aktion hinzu.
Wählen Sie im Fenster Fakten-Explorer XML-Schemas aus.
Ziehen Sie auf der Registerkarte XML-Schemas den von Ihnen gewünschten Entitätsknoten zum Argument in der Reassert-Funktion.
Wenn Sie eine übergeordnete TypedXmlDocument-Entität erneut erstellen, können die untergeordneten TypedXmlDocument-Entitäten, die beim erstmaligen Einfügen der TypedXmlDocument-Entität erstellt wurden, je nach Status der einzelnen untergeordneten TypedXmlDocument-Entität ein unterschiedliches Verhalten aufweisen.
Beispiel: Wenn eine neue oder vorhandene untergeordnete Entität „geändert“ ist, wenn also mindestens ein Feld im Regelsatz mithilfe einer Aktion geändert wurde, dann wird für dieses untergeordnete Element eine Assert- oder Reassert-Funktion ausgeführt. Alle vorhandenen untergeordneten Entitäten, die nicht geändert sind, verbleiben im Arbeitsspeicher.
Hinweis
Ein Knoten ist nicht als geändert gekennzeichnet, wenn es sich dabei um externe Vorgänge handelt, über die die Engine kein Wissen hat. Beispiel: Eine externe Anwendung fügt diesen Knoten programmgesteuert hinzu, löscht den Knoten oder aktualisiert ihn.
Das folgende Beispiel veranschaulicht ein vereinfachtes Szenario, in dem das Verhalten der untergeordneten Entität beim erneuten Einfügen der übergeordneten Entität beschrieben wird. Angenommen, die folgenden TypedXmlDocument-Entitäten befinden sich in Ihrem Arbeitsspeicher: Parent, Child1, Child2 und Child3.
- Parent ist die übergeordnete TypedXmlDocument-Entität.
- Jede untergeordnete Entität enthält ein Feld mit dem Namen ExampleField, wobei der Wert auf 1 festgelegt ist, z. B.
Child1.ExampleField
= 1`.
Angenommen, eine Regelaktion führt die folgenden Vorgänge für die untergeordneten Entitäten aus:
- Der Wert von ExampleField für Child2 wird von 1 auf 0 aktualisiert.
- Der Benutzercode löscht Child3.
- Der Benutzercode fügt Parent eine neue untergeordnete TypedXmlDocument-Entität namens NewChild hinzu.
Das folgende Beispiel veranschaulicht die neue Darstellung von Objekten im Arbeitsspeicher:
Parent
Child1 // Where Child1.ExampleField = 1
Child2 // Where Child2.ExampleField = 0
NewChild
Angenommen, Sie fügen die Parent-Entität erneut ein, was zum folgenden Verhalten der untergeordneten Entitäten führt:
- Child2 wird erneut eingefügt, weil die Entität nach der Aktualisierung des Felds nun geändert ist.
- Child3 wird aus dem Arbeitsspeicher zurückgezogen.
- NewChild wird in den Arbeitsspeicher eingefügt.
- Child1 verbleibt unverändert im Arbeitsspeicher, weil die Entität vor dem erneuten Einfügen von Parent nicht aktualisiert wurde.
Funktion „Update“
Verwenden Sie die Update-Funktion in Microsoft Rules Composer, um ein Objekt basierend auf den neuen Daten und dem Status in die Rules-Engine zur erneuten Auswertung einzufügen. Das Objekt kann über den .NET-Klassentyp oder den TypedXmlDocument-Typ verfügen. Sie können außerdem die Update-Funktion verwenden, um die Leistung der Engine zu verbessern und Endlosschleifenszenarios zu vermeiden.
Wichtig
Die maximale Standardanzahl von Schleifen für die Neuauswertung von Regeln beträgt 2^32. Daher kann die Regelsatzausführung bei bestimmten Regeln lange dauern. Ändern Sie die Eigenschaft Maximale Tiefe der Ausführungsschleife der Regelsatzversion, um die Anzahl der Schleifen zu verringern.
Aktualisieren eines .NET-Objekts
Suchen Sie im Fenster RuleSet-Explorer die von Ihnen gewünschte Regel, und wählen Sie diese aus.
Fügen Sie im Bereich THEN unter Aktionen die integrierte Update-Funktion als Aktion hinzu.
Wählen Sie im Fenster Fakten-Explorer .NET-Klassen aus.
Ziehen Sie auf der Registerkarte .NET-Klassen die Klasse in das Argument für die Update-Funktion.
In der Regel wird die Assert-Funktion verwendet, um ein neues Objekt im Arbeitsspeicher der Regel-Engine zu platzieren, und die Update-Funktion wird verwendet, um ein bereits vorhandenes Objekt im Arbeitsspeicher zu aktualisieren. Wenn Sie ein neues Objekt als Fakt einfügen, wertet die Engine die Bedingungen in allen Regeln erneut aus. Wenn Sie jedoch ein vorhandenes Objekt aktualisieren, überprüft die Engine lediglich die Bedingungen erneut, die das aktualisierte Fakt verwenden, und fügt der Agenda Aktionen hinzu, wenn diese Bedingungen als TRUE ausgewertet werden.
Angenommen, Sie verfügen über die folgenden Regeln und die Objekte mit dem Namen ItemA und ItemB befinden sich bereits im Arbeitsspeicher.
Regel 1 wertet die Id-Eigenschaft in ItemA aus, legt die Id-Eigenschaft für ItemB fest und fügt anschließend ItemB nach der Änderung erneut ein. Wenn ItemB erneut eingefügt wird, behandelt die Engine ItemB als neues Objekt und wertet alle Regeln erneut aus, die ItemB in den Prädikaten oder Aktionen verwenden. Dieses Verhalten stellt sicher, dass die Engine Regel 2 anhand des neuen Werts in ItemB.Id erneut auswertet, wie in Regel 1 festgelegt.
Regel 1
IF ItemA.Id == 1 THEN ItemB.Id = 2 Assert(ItemB)
Durch Regel 2 schlägt die erste Auswertung möglicherweise fehl. Sie wird jedoch während der zweiten Auswertung als TRUE ausgewertet.
Regel 2
IF ItemB.Id == 2 THEN ItemB.Value = 100
Die Funktion zum erneuten Einfügen von Objekten in den Arbeitsspeicher bietet Ihnen explizite Kontrolle über das Verhalten in Vorwärtsverkettungsszenarios. In diesem Beispiel wird jedoch ein Nebeneffekt des erneuten Einfügens veranschaulicht, bei dem Regel 1 ebenfalls erneut ausgewertet wird. Da ItemA.Id unverändert bleibt, wird Regel 1 erneut als TRUE ausgewertet, und die Aktion Assert(ItemB) wird erneut ausgelöst. In der Folge erstellt die Regel eine Endlosschleife.
Verhindern von Endlosschleifen
Sie müssen Objekte erneut einfügen können, ohne dabei Endlosschleifen zu erzeugen. Um solche Szenarios zu vermeiden, können Sie die Update-Funktion verwenden. Wie die Reassert-Funktion führt die Update-Funktion die Funktionen Retract und Assert für die zugeordneten Objektinstanzen aus, die durch Regelaktionen geändert werden – allerdings mit den folgenden entscheidenden Unterschieden:
Die Aktionen für Regeln verbleiben in der Agenda, wenn der Instanztyp ausschließlich in den Aktionen und nicht den Prädikaten verwendet wird.
Regeln, die ausschließlich den Instanztyp in Aktionen verwenden, werden nicht erneut ausgewertet.
Daher werden Regeln, die die Instanztypen verwenden, entweder ausschließlich in den Prädikaten oder sowohl in den Prädikaten als auch in den Aktionen erneut ausgewertet, und die Aktionen der Regeln werden der Agenda entsprechend hinzugefügt.
Wenn Sie das vorangegangene Beispiel so ändern, dass die Update-Funktion verwendet wird, können Sie sicherstellen, dass die Engine lediglich Regel 2 erneut auswertet, weil die Bedingung für Regel 2 ItemB verwendet. Die Engine wertet Regel 1 nicht erneut aus, weil ItemB lediglich in den Aktionen für Regel 1* verwendet wird, wodurch das Schleifenszenario entfällt.
Regel 1
IF ItemA.Id == 1
THEN ItemB.Id = 2
Update(ItemB)
Regel 2
IF ItemB.Id == 2
THEN ItemB.Value = 100
Selbst wenn die Update-Funktion auf diese Weise verwendet wird, besteht die Möglichkeit, dass das Schleifenszenarios entstehen. Betrachten Sie beispielsweise die folgende Regel:
IF ItemA.Id == 1
THEN ItemA.Value = 20
Update(ItemA)
Das Prädikat verwendet ItemA, wodurch die Engine die Regel erneut auswertet, wenn die Update-Funktion für ItemA aufgerufen wird. Wenn der Wert für ItemA.Id nicht an anderer Stelle geändert wird, wird Regel 1 weiterhin als TRUE ausgewertet, wodurch die Update-Funktion für ItemA erneut aufgerufen wird.
Als Entwickler der Regel müssen Sie solche Schleifenszenarios vermeiden. Der geeignete Ansatz, sich dieser Problemstellung zu widmen, unterscheidet sich je nach Art der Regeln.
Das folgende Beispiel veranschaulicht eine einfache Möglichkeit, sich dem Problem im vorherigen Beispiel zu widmen, indem eine Überprüfung für ItemA.Value hinzugefügt wird, die verhindert, dass die Regel nach der ersten Ausführung der Regelaktionen als TRUE ausgewertet wird.
IF ItemA.Id == 1 and ItemA.Value != 20
THEN ItemA.Value = 20
Update(ItemA)
Aktualisieren einer TypedXmlDocument-Entität
Suchen Sie im Fenster RuleSet-Explorer die von Ihnen gewünschte Regel, und wählen Sie diese aus.
Fügen Sie im Bereich THEN unter Aktionen die integrierte Update-Funktion als Aktion hinzu.
Wählen Sie im Fenster Fakten-Explorer XML-Schemas aus.
Ziehen Sie auf der Registerkarte XML-Schemas den von Ihnen gewünschten Entitätsknoten zum Argument in der Update-Funktion.
Beispiel: Angenommen, Sie haben die folgenden Regeln:
Regel 1 wertet die Gesamtanzahl der Artikel in einer Bestellnachricht aus.
IF 1 == 1 THEN ProcessPO.Order:/Order/Items/TotalCount = (ProcessPO.Order:/Order/Items/TotalCount + ProcessPO:/Order/Items/Item/Count)
Regel 2 legt den Status auf „Needs approval“ fest, wenn die Gesamtanzahl mindestens 10 beträgt.
Regel 2
IF ProcessPO.Order:/Order/Items/TotalCount >= 10 THEN ProcessPO.Order:/Order/Status = "Needs approval"
Wenn Sie die folgende Bestellnachricht als Eingabe an diesen Regelsatz übergeben, ist der Status nicht auf „Needs approval“ festgelegt, selbst wenn TotalCount 14 beträgt. Dieses Verhalten tritt auf, weil Regel 2 lediglich zu Beginn ausgewertet wird, wenn der TotalCount-Wert 0 beträgt. Die Regel wird nicht jedes Mal ausgewertet, wenn TotalCount aktualisiert wird.
<ns0:Order xmlns:ns0="http://ProcessPO.Order">
<Items>
<Item>
<Id>ITM1</Id>
<Count>2</Count>
</Item>
<Item>
<Id>ITM2</Id>
<Count>5</Count>
</Item>
<Item>
<Id>ITM3</Id>
<Count>7</Count>
</Item>
<TotalCount>0</TotalCount>
</Items>
<Status>No approval needed</Status>
</ns0:Order>
Sie müssen die Update-Funktion auf dem übergeordneten Knoten (Items) für den aktualisierten Knoten (TotalCount) aufrufen, damit die Engine die Bedingungen jedes Mal erneut auswertet, wenn TotalCount aktualisiert wird. Wenn Sie Regel 1 folgendermaßen ändern und die Regel ein weiteres Mal testen, wird das Status-Feld auf „Needs approval“ festgelegt:
Regel 1 (aktualisiert)
IF 1 == 1
THEN ProcessPO.Order:/Order/Items/TotalCount = (ProcessPO.Order:/Order/Items/TotalCount + ProcessPO:/Order/Items/Item/Count) AND
Update(ProcessPO.Order:/Order/Items)