Udostępnij za pośrednictwem


Dodawanie funkcji kontroli w akcjach w celu optymalizacji wykonywania reguł przy użyciu narzędzia Microsoft Rules Composer (wersja zapoznawcza)

Dotyczy: Azure Logic Apps (Standardowa)

Ważne

Ta funkcja jest dostępna w wersji zapoznawczej i podlega dodatkowym warunkom użytkowania wersji zapoznawczej platformy Microsoft Azure.

W tym przewodniku opisano sposób optymalizowania wykonywania reguł przez dodanie funkcji kontroli do akcji w regułach przy użyciu narzędzia Microsoft Rules Composer. Funkcje sterujące ułatwiają aplikacji lub zestawowi reguł kontrolowanie faktów w pamięci roboczej aparatu reguł. Te funkcje obejmują funkcje Assert, Clear, Halt, Retract, RetractByType, Reassert i Update dla obiektów platformy .NET oraz jednostek TypedXmlDocument, których można użyć jako faktów. Istnienie faktów w pamięci roboczej napędza warunki, które aparat ocenia i akcje, które wykonują.

Wymagania wstępne

  • Pobierz i zainstaluj program Microsoft Rules Composer.

  • Plik XML zawierający zestaw reguł, nad którym chcesz pracować.

    Aby dodać fakty, określ ich wartości w dokumentach XML wskazywanych w oknie Eksplorator zestawu reguł. Możesz też użyć twórcy faktów, aby podać aparat reguł z tablicą zawierającą obiekty platformy .NET jako fakty. Aby uzyskać więcej informacji, zobacz Tworzenie twórców faktów i elementów pobierania.

Funkcja Assert

Aby dodać wystąpienia obiektów do pamięci roboczej aparatu reguł, użyj funkcji Assert w programie Microsoft Rules Composer. Aparat przetwarza każde wystąpienie obiektu zgodnie z warunkami i akcjami, które są zapisywane względem typu wystąpienia przy użyciu faz rozwiązywania konfliktów dopasowania.

W poniższej tabeli podsumowano zachowanie funkcji Assert dla obsługiwanych jednostek i typów wystąpień, w tym liczbę wystąpień wynikowych utworzonych w aplecie dla każdej jednostki asertywnej oraz typ zastosowany do każdego wystąpienia w celu identyfikacji.

Encja Liczba wystąpień aserowanych Typ wystąpienia
Obiekt .NET 1 (sam obiekt) W pełni kwalifikowana klasa .NET
TypedXmlDocument 1-N TypedXmlDocument(s): na podstawie utworzonych powiązań selektora i zawartości dokumentu DocumentType.Selector

Potwierdzanie obiektu platformy .NET

Aparat reguł natywnie obsługuje podstawowe typy skalarne i obiekty platformy .NET dla typów referencyjnych. Asertywne przetwarzanie obiektów platformy .NET jest najprostszym typem przetwarzania.

W narzędziu Microsoft Rules Composer możesz potwierdzić obiekt platformy .NET z poziomu reguły.

  1. W narzędziu Microsoft Rules Composer załaduj plik XML zawierający magazyn reguł, nad którym chcesz pracować.

  2. W oknie Eksplorator zestawu reguł znajdź i wybierz odpowiednią regułę.

  3. W okienku THEN w obszarze Akcje dodaj wbudowaną funkcję Assert jako akcję.

  4. W oknie Eksplorator faktów wybierz pozycję Klasy platformy .NET.

  5. Na karcie Klasy platformy .NET przeciągnij metodę konstruktora dla obiektu, który ma zostać argumentem w akcji Assert.

    Narzędzie Microsoft Rules Composer tłumaczy metodę konstruktora na wywołanie CreateObject w definicji reguły.

    Uwaga

    Mimo że aparat reguł ma funkcję CreateObject , funkcja nie jest wyświetlana jako osobna funkcja w narzędziu Microsoft Rules Composer.

Każdy obiekt jest potwierdzany w pamięci roboczej jako oddzielne wystąpienie obiektu, co oznacza, że każdy predykat odwołujący się do typu obiektu, taki jak IF Object.Property = 1, analizuje wystąpienie. Wystąpienie jest również dostępne dla akcji reguł odwołujących się do typu na podstawie wyników warunków reguły.

Załóżmy na przykład, że masz następujące reguły:

Reguła 1

IF A.Value = 1
THEN A.Status = "good"

Reguła 2

IF B.Value = 1
THEN A.Status = "good"

W regule 1 tylko wystąpienia A o wartości 1 mają zaktualizowaną właściwość Status . Jednak w regule 2, jeśli warunek ma wartość true, wszystkie wystąpienia A mają zaktualizowany stan. W rzeczywistości, jeśli istnieje wiele wystąpień B, wystąpienia A są aktualizowane za każdym razem, gdy warunek zwróci wartość true dla wystąpienia B.

Asercja jednostki TypedXmlDocument

W narzędziu Microsoft Rules Composer możesz potwierdzić jednostkę TypedXmlDocument z poziomu reguły.

  1. W oknie Eksplorator zestawu reguł znajdź i wybierz odpowiednią regułę.

  2. W okienku THEN w obszarze Akcje dodaj wbudowaną funkcję Assert jako akcję.

  3. W oknie Eksplorator faktów wybierz pozycję Schematy XML.

  4. Na karcie Schematy XML przeciągnij węzeł, który ma zostać argumentem w akcji Assert.

Dokumenty XML są w zasadzie tekstem, ale wartości pól mogą być dowolnym typem, który jest oparty na określonym typie podczas tworzenia reguły. Pola są wyrażeniami XPath, więc mogą zwracać zestaw węzłów, co oznacza, że pierwszy element w zestawie jest używany jako wartość.

Gdy jednostka TypedXmlDocument jest potwierdzana jako fakt, aparat reguł tworzy wystąpienia podrzędne TypedXmlDocument na podstawie selektorów zdefiniowanych w regule. Selektory można traktować jako sposób izolowania węzłów w dokumencie XML i pól jako identyfikowania określonych elementów w selektorze. Aparat reguł grupuje wszystkie pola wewnątrz jednego selektora jako obiekt.

Selektory są również wyrażeniami XPath. W Eksploratorze faktów po wybraniu węzła na karcie Schematy XML program Microsoft Rules Composer automatycznie wypełnia właściwość selektora XPath dla wszystkich węzłów i właściwości XPath Field dla każdego węzła, który nie zawiera węzłów podrzędnych. Alternatywnie możesz w razie potrzeby wprowadzić własne wyrażenia XPath dla selektora XPath i pola XPath. Jeśli selektor pasuje do wielu części w dokumencie XML, wiele obiektów tego typu jest aserowanych do lub wycofanych z pamięci roboczej aparatu reguł.

W tym samym dokumencie można użyć wielu selektorów. W ten sposób można wyświetlić różne części dokumentu, na przykład załóżmy, że jedna sekcja jest zamówieniem, a druga zawiera adres wysyłkowy. Należy jednak pamiętać, że utworzone obiekty są definiowane przez ciąg XPath, który je utworzył. Jeśli używasz innego wyrażenia XPath, wynikiem jest unikatowa jednostka TypedXmlDocument , nawet jeśli wyrażenie zostanie rozpoznane w tym samym węźle.

Załóżmy na przykład, że masz następujący kod XML:

<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>

Jeśli używasz selektora /root/order lub kolejności, następujące obiekty są dodawane do pamięci roboczej aparatu:

Obiekt 1

<order customer="Joe">
    <item name="router" quantity="10" cost="550" />
    <item name="switch" quantity="3" cost="300" />
</order>

Obiekt 2

<order customer="Jane">
    <item name="switch" quantity="1" cost="300" />
    <item name="cable" quantity="23" cost="9.99" />
</order>

W ramach każdego selektora ścieżki XPaths odwołują się do poszczególnych pól. Dlatego jeśli używasz selektora /root/order/item, order/item lub elementu, następujące obiekty są dodawane do pamięci roboczej aparatu z dwoma elementami dla Joe i dwoma elementami dla Jane:

<root>
    <order customer="Joe">
    </order>
    <order customer="Jane">
    </order>
</root>

Każdy obiekt może uzyskiwać dostęp do trzech pól: @name, @quantity i @cost. Możesz odwołać się do pól nadrzędnych, ponieważ obiekt jest odwołaniem do oryginalnego dokumentu, na przykład .. /@customer.

Aparat reguł może przekonwertować wartość pola tekstowego na dowolny z obsługiwanych typów za pomocą funkcji XmlConvert . Tę opcję można określić, ustawiając typ w edytorze reguł firmy Microsoft. Jeśli konwersja nie jest możliwa, aparat zgłasza wyjątek. Wartości logiczne i podwójne można pobrać tylko jako odpowiedni typ, ciągi lub obiekty.

Clear, funkcja

Aby zresetować pamięć roboczą i program dla wystąpienia aparatu reguł, użyj funkcji Clear w programie Microsoft Rules Composer. Aby uzyskać więcej informacji na temat pamięci roboczej i programu, zobacz Optymalizacja aparatu reguł.

Resetowanie pamięci roboczej i programu dla aparatu reguł

  1. W oknie Eksplorator zestawu reguł znajdź i wybierz regułę, w której chcesz wyczyścić pamięć roboczą i plan aparatu reguł.

  2. W okienku THEN w obszarze Akcje dodaj wbudowaną funkcję Clear jako akcję.

    Funkcja Clear nie przyjmuje żadnych argumentów.

Halt, funkcja

Aby zatrzymać bieżące wykonywanie przez aparat reguł, użyj funkcji Halt w narzędziu Microsoft Rules Composer.

Zatrzymywanie wykonywania zestawu reguł

  1. W oknie Eksplorator zestawu reguł znajdź i wybierz regułę, w której chcesz zatrzymać wykonywanie zestawu reguł.

  2. W okienku THEN w obszarze Akcje dodaj wbudowaną funkcję Halt jako akcję.

Funkcja Halt przyjmuje jeden argument logiczny . Jeśli określisz wartość true, aparat reguł wyczyści plan zawierający oczekujące reguły kandydata.

Metoda Ruleset.Execute jest otoką metody RuleEngine.Execute i używa kodu podobnego do następującego kodu:

RuleEngine.Assert(facts);
RuleEngine.Execute();
RuleEngine.Retract(facts);

Jeśli używasz metody Ruleset.Execute do wykonywania zestawu reguł, aparat reguł zwraca kontrolkę do metody Ruleset.Execute po wykonaniu funkcji Halt . Metoda Ruleset.Execute wycofuje fakty i zwraca kontrolkę do elementu wywołującego. W takim przypadku zatrzymane wykonywanie zestawu reguł nie może wznowić.

Jeśli jednak bezpośrednio użyjesz metody RuleEngine.Execute do wykonania zestawu reguł, możesz wznowić zatrzymane wykonywanie zestawu reguł, uruchamiając kolejną oczekującą regułę, wywołując ponownie metodę RuleEngine.Execute , pod warunkiem, że nie wycofano żadnych obiektów wymaganych między dwoma wywołaniami.

Uwaga

Metoda Ruleset.Execute buforuje wystąpienia aparatu reguł w celu uzyskania lepszej wydajności. Jeśli bezpośrednio używasz metody RuleEngine.Execute , wystąpienia aparatu reguł nie są buforowane.

Poniższy przykładowy kod pokazuje, jak wznowić zatrzymane wykonywanie zestawu reguł:

// 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, funkcja

Aby usunąć obiekty z zestawu reguł i pamięci roboczej aparatu reguł, użyj funkcji Retract w programie Microsoft Rules Composer.

Wycofaj obiekt platformy .NET

  1. W oknie Eksplorator zestawu reguł znajdź i wybierz odpowiednią regułę.

  2. W okienku THEN w obszarze Akcje dodaj wbudowaną funkcję Retract jako akcję.

  3. W oknie Eksplorator faktów wybierz pozycję Klasy platformy .NET.

  4. Na karcie Klasy platformy .NET przeciągnij odpowiednią klasę, a nie zestaw lub metodę do argumentu parametru Retract.

    Jeśli przeciągniesz metodę do funkcji Retract , aparat spróbuje wycofać obiekt zwrócony przez metodę .

Wycofanie obiektu platformy .NET ma następujący wpływ:

  • Działania w porządku obrad, które używają obiektów, są usuwane z porządku obrad.

    Uwaga

    Inne działania wyższe w porządku obrad mogły już zostać wykonane przed użyciem funkcji Retract .

  • Zasady, które używają obiektu w predykacie, mają swoje działania usunięte z porządku obrad, jeśli istnieją jakiekolwiek działania w porządku dziennym.

  • Aparat nie ocenia już obiektu.

Wycofaj jednostkę lub jednostki TypedXmlDocument

Możesz wycofać oryginalną jednostkę TypedXmlDocument, która została twierdzona w apletu reguł, lub wycofać jedną z jednostek podrzędnych TypedXmlDocument utworzonych na podstawie nadrzędnej jednostki XmlDocument.

Załóżmy, że masz następujący przykładowy kod XML:

<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>

Możesz wycofać jednostkę TypedXmlDocument skojarzona z obiektem zamówienia lub wycofać jedną lub obie jednostki TypedXmlDocument skojarzone z obiektem orderline. Wszystkie jednostki TypedXmlDocument są skojarzone z jednostką TypedXmlDocument najwyższego poziomu, która została pierwotnie asercja, a nie z jednostką TypedXmlDocument, która jest wyświetlana powyżej tego węzła TypedXmlDocument najwyższego poziomu w hierarchii drzewa XML.

Na przykład produkt jest jednostką TypedXmlDocument poniżej obiektu orderline i jest skojarzona z jednostką TypedXmlDocument dla zamówienia, a nie jednostką TypedXmlDocument dla wiersza zamówienia. W większości przypadków to rozróżnienie nie jest ważne. Jeśli jednak wycofasz obiekt zamówienia , obiekty orderline i product również zostaną wycofane. Jeśli obiekt orderline zostanie wycofany, tylko ten obiekt zostanie wycofany, a nie obiekt produktu .

Aparat działa tylko z wystąpieniami obiektów TypedXmlDocument i śledzi je, że aparat utworzony podczas początkowego potwierdzenia jednostki TypedXmlDocument. Jeśli tworzysz dodatkowe węzły, takie jak węzły równorzędne dla węzła wybranego za pomocą selektora w zestawie reguł, te węzły nie są oceniane w regułach, chyba że jednostki TypedXmlDocument zostaną utworzone i asertywne dla nich. Jeśli potwierdzisz te nowe wystąpienia TypedXmlDocument niższego poziomu, aparat ocenia wystąpienia w regułach, ale jednostka TypedXmlDocument najwyższego poziomu nie ma wiedzy na ich temat. Po wycofaniu obiektu TypedXmlDocument najwyższego poziomu nowe jednostki TypedXmlDocument nie są automatycznie wycofane. W związku z tym, jeśli zostaną utworzone nowe węzły, wykonaj polecenie Retract i Reassert w pełnej kodzie XmlDocument, co jest typowym i najprostszym krokiem do wykonania.

Klasa TypedXmlDocument udostępnia przydatne metody, które można wywołać w niestandardowym elemencie członkowskim platformy .NET w ramach akcji. Metody te obejmują możliwość pobrania xmlnode skojarzonego z TypedXmlDocument lub nadrzędnego TypedXmlDocument.

Wycofaj jednostkę TypedXmlDocument najwyższego poziomu

  1. W oknie Eksplorator zestawu reguł znajdź i wybierz odpowiednią regułę.

  2. W okienku THEN w obszarze Akcje dodaj wbudowaną funkcję Retract jako akcję.

  3. W oknie Eksplorator faktów wybierz pozycję Schematy XML.

  4. Na karcie Schematy XML przeciągnij węzeł najwyższego poziomu dla schematu do argumentu funkcji Retract.

    Ten górny węzeł kończy się rozszerzeniem xsd i reprezentuje węzeł główny dokumentu, a nie węzeł elementu dokumentu. Węzeł ma / selektor, który odwołuje się do początkowego TypedXmlDocument. Po wycofaniu nadrzędnego obiektu TypedXmlDocument wszystkie jednostki podrzędne TypedXmlDocument skojarzone z typedXmlDocument zostaną usunięte z pamięci roboczej, w tym wszystkie jednostki TypedXmlDocument utworzone przez wywołanie funkcji Assert na podstawie selektorów używanych w zestawie reguł.

Wycofaj podrzędną jednostkę TypedXmlDocument

  1. W oknie Eksplorator zestawu reguł znajdź i wybierz odpowiednią regułę.

  2. W okienku THEN w obszarze Akcje dodaj wbudowaną funkcję Retract jako akcję.

  3. W oknie Eksplorator faktów wybierz pozycję Schematy XML.

  4. Na karcie Schematy XML przeciągnij węzeł podrzędny do argumentu funkcji Retract.

RetractByType, funkcja

Aby usunąć wszystkie obiekty z określonym typem z pamięci roboczej aparatu reguł, użyj funkcji RetractByType w programie Microsoft Rules Composer. Ta funkcja różni się od funkcji Retract , która usuwa tylko określone elementy z określonym typem.

Wycofaj wszystkie obiekty platformy .NET z określonym typem

  1. W oknie Eksplorator zestawu reguł znajdź i wybierz odpowiednią regułę.

  2. W okienku THEN w obszarze Akcje dodaj wbudowaną funkcję RetractByType jako akcję.

  3. W oknie Eksplorator faktów wybierz pozycję Klasy platformy .NET.

  4. Na karcie Klasy platformy .NET przeciągnij klasę do argumentu funkcji RetractByType.

Wycofaj wszystkie jednostki TypedXmlDocument z określonym typem

RetractByType usuwa wszystkie jednostki TypedXmlDocument z tym samym typem DocumentType.Selector.

  1. W oknie Eksplorator zestawu reguł znajdź i wybierz odpowiednią regułę.

  2. W okienku THEN w obszarze Akcje dodaj wbudowaną funkcję RetractByType jako akcję.

  3. W oknie Eksplorator faktów wybierz pozycję Schematy XML.

  4. Na karcie Schematy XML przeciągnij odpowiedni węzeł do funkcji RetractByType.

Zgodnie z funkcją Retract, jeśli używasz funkcji RetractByType w węźle głównym dokumentu, nie tylko ta akcja powoduje wycofanie wszystkich jednostek TypedXmlDocument asercji z tym typetype, ale także wszystkich podrzędnych jednostek TypedXmlDocument lub węzłów XmlNode w hierarchii drzewa skojarzonych z tymi nadrzędnymi jednostkami TypedXmlDocument.

Reassert, funkcja

Aby wywołać funkcję Assert dla obiektu, który już istnieje w pamięci roboczej aparatu, użyj funkcji Reassert w narzędziu Microsoft Rules Composer. Zachowanie jest równoważne wystawianiu polecenia Retract dla obiektu, po którym następuje polecenie Assert .

Jeśli na przykład używasz funkcji Reassert w obiekcie platformy .NET, aparat reguł wykonuje następujące czynności:

  1. Wycofaj obiekt .NET z pamięci roboczej.

  2. Usuń wszelkie akcje w porządku obrad dla reguł, które używają obiektu w predykacie lub akcji.

  3. Potwierdzanie obiektu platformy .NET z powrotem do pamięci roboczej i ocenianie go jako nowo asertywnego obiektu.

  4. Przeszacuj wszystkie reguły, które używają obiektu w predykacie i dodaj odpowiednie działania tych reguł do programu.

  5. Odczytano akcje programu dla wszystkich reguł, które wcześniej oceniane jako prawda i używają tylko obiektu w swoich działaniach.

Ponowne tworzenie obiektu platformy .NET

  1. W oknie Eksplorator zestawu reguł znajdź i wybierz odpowiednią regułę.

  2. W okienku THEN w obszarze Akcje dodaj wbudowaną funkcję Reassert jako akcję.

  3. W oknie Eksplorator faktów wybierz pozycję Klasy platformy .NET.

  4. Na karcie Klasy platformy .NET przeciągnij klasę do argumentu funkcji Reassert.

Reassert a TypedXmlDocument, jednostka

  1. W oknie Eksplorator zestawu reguł znajdź i wybierz odpowiednią regułę.

  2. W okienku THEN w obszarze Akcje dodaj wbudowaną funkcję Reassert jako akcję.

  3. W oknie Eksplorator faktów wybierz pozycję Schematy XML.

  4. Na karcie Schematy XML przeciągnij węzeł jednostki, który ma zostać argumentem w funkcji Reassert.

Jeśli ponownie utworzysz jednostkę podrzędną TypedXmlDocument najwyższego poziomu, jednostki podrzędne TypedXmlDocument, które zostały utworzone podczas pierwszego potwierdzenia jednostki TypedXmlDocument najwyższego poziomu, mogą zachowywać się inaczej, w zależności od stanu każdej jednostki podrzędnej TypedXmlDocument.

Jeśli na przykład nowa lub istniejąca jednostka podrzędna jest "brudna", co oznacza, że co najmniej jedno pole zostało zmienione w zestawie reguł przy użyciu akcji, funkcja Assert lub funkcja Reassert jest wykonywana na tym elemecie podrzędnym. Wszystkie istniejące elementy podrzędne, które nie są zanieczyszczone, pozostają w pamięci roboczej.

Uwaga

Węzeł nie jest oznaczony jako zanieczyszczony z operacji zewnętrznych, o których aparat nie wie, na przykład, że zewnętrzna aplikacja programowo dodaje, usuwa lub aktualizuje ten węzeł.

W poniższym przykładzie przedstawiono uproszczony scenariusz, który opisuje zachowania jednostki podrzędnej, gdy ich jednostka nadrzędna zostanie ponownie przetestowana. Załóżmy, że masz następujące jednostki TypedXmlDocument w pamięci roboczej: Parent, Child1, Child2 i Child3.

  • Element nadrzędny to jednostka TypedXmlDocument najwyższego poziomu.
  • Każde dziecko zawiera pole o nazwie ExampleField, gdzie wartość jest ustawiona na 1, na przykład Child1.ExampleField = 1".

Załóżmy, że akcja reguły wykonuje następujące operacje na jednostkach podrzędnych:

  • Wartość ExampleField elementu Child2 jest aktualizowana z zakresu od 1 do 0.
  • Kod użytkownika usuwa element Child3.
  • Kod użytkownika dodaje nową jednostkę podrzędną TypedXmlDocument o nazwie NewChild do elementu nadrzędnego.

W poniższym przykładzie przedstawiono nową reprezentację obiektów w pamięci roboczej:

Parent
Child1 // Where Child1.ExampleField = 1
Child2 // Where Child2.ExampleField = 0
NewChild

Teraz załóżmy, że ponownie wyświetlasz jednostkę nadrzędną, co powoduje następujące zachowania jednostek podrzędnych:

  • Child2 jest ponownie potwierdzany, ponieważ jest teraz brudny po zaktualizowaniu pola.
  • Element Child3 jest wycofany z pamięci roboczej.
  • Funkcja NewChild jest potwierdzana w pamięci roboczej.
  • Element Child1 pozostaje niezmieniony w pamięci roboczej, ponieważ nie został zaktualizowany przed ponownym sprawdzeniem elementu nadrzędnego .

Funkcja Update

Aby ponownie zapisać obiekt w akompaniamencie reguł na potrzeby ponownej oceny, na podstawie nowych danych i stanu, użyj funkcji Update w narzędziu Microsoft Rules Composer. Obiekt może mieć typ klasy .NET lub typ TypedXmlDocument . Możesz również użyć funkcji Update , aby poprawić wydajność aparatu i zapobiec niekończącym się scenariuszom pętli.

Ważne

Domyślna maksymalna liczba pętli dla ponownej oceny reguł wynosi 2^32, więc w przypadku niektórych reguł wykonywanie zestawu reguł może trwać długo. Aby zmniejszyć liczbę pętli, zmień właściwość Maksymalna głębokość pętli wykonywania w wersji zestawu reguł.

Aktualizowanie obiektu platformy .NET

  1. W oknie Eksplorator zestawu reguł znajdź i wybierz odpowiednią regułę.

  2. W okienku THEN w obszarze Akcje dodaj wbudowaną funkcję Update jako akcję.

  3. W oknie Eksplorator faktów wybierz pozycję Klasy platformy .NET.

  4. Na karcie Klasy platformy .NET przeciągnij klasę do argumentu funkcji Update.

Zazwyczaj używasz asercji , aby umieścić nowy obiekt w pamięci roboczej aparatu reguł i użyć funkcji Update , aby zaktualizować już istniejący obiekt w pamięci roboczej. W przypadku potwierdzenia nowego obiektu jako faktu aparat ponownie waliduje warunki we wszystkich regułach. Jednak podczas aktualizowania istniejącego obiektu aparat ponownie ocenia tylko warunki, które używają zaktualizowanego faktu i dodaje akcje do porządku obrad, jeśli te warunki mają wartość true.

Załóżmy na przykład, że masz następujące reguły i że obiekty o nazwie ItemA i ItemB już istnieją w pamięci roboczej.

  • Reguła 1 ocenia właściwość Id w elemencie ItemA, ustawia właściwość Id w elemencie ItemB, a następnie ponownie wykonuje usługę ItemB po zmianie. Gdy element ItemB zostanie ponownie wyświetlony, aparat traktuje element ItemB jako nowy obiekt, a aparat ponownie waliduje wszystkie reguły, które używają elementu ItemB w predykatach lub akcjach. To zachowanie zapewnia, że aparat ponownie wycenia regułę 2 względem nowej wartości w ItemB.Id ustawionej w regule 1.

    Reguła 1

    IF ItemA.Id == 1
    THEN ItemB.Id = 2
    Assert(ItemB)
    
  • Reguła 2 może zakończyć się niepowodzeniem podczas pierwszej oceny, ale daje wartość true podczas drugiej oceny.

    Reguła 2

    IF ItemB.Id == 2
    THEN ItemB.Value = 100
    

Możliwość ponownego wysyłania obiektów do pamięci roboczej zapewnia jawną kontrolę nad zachowaniem w scenariuszach tworzenia łańcuchów przesyłania dalej. Jednak w tym przykładzie przedstawiono efekt uboczny od ponownego oceny, w którym reguła 1 jest również ponownie oceniane. Jeśli ItemA.Id niezmienione, reguła 1 ponownie zwróci wartość true, a akcja Assert(ItemB) zostanie ponownie wyzwolona. W rezultacie reguła tworzy sytuację nieskończonej pętli.

Zapobieganie nieskończonym pętlom

Musisz mieć możliwość ponownego wprowadzania obiektów bez tworzenia nieskończonych pętli. Aby uniknąć takich scenariuszy, możesz użyć funkcji Update . Podobnie jak funkcja Reassert, funkcja Update wykonuje funkcje Retract i Assert w skojarzonych wystąpieniach obiektów, które są zmieniane przez akcje reguły, ale z następującymi kluczowymi różnicami:

  • W porządku obrad działania dotyczące reguł pozostają w porządku obrad, gdy typ wystąpienia jest używany tylko w działaniach, a nie predykatów.

  • Reguły, które używają tylko typu wystąpienia w akcjach, nie są ponownie oceniane.

W rezultacie reguły, które używają typów wystąpień, tylko w predykatach lub zarówno predykatach, jak i działaniach, są ponownie oceniane, a działania reguł są dodawane do porządku obrad zgodnie z potrzebami.

Zmieniając poprzedni przykład tak, aby korzystał z funkcji Update, możesz upewnić się, że aparat ponownie oblicza tylko regułę 2, ponieważ warunek reguły 2 używa elementu ItemB. Aparat nie przeszacuje reguły 1 , ponieważ element ItemB jest używany tylko w akcjach dla reguły 1*, eliminując scenariusz pętli.

Reguła 1

IF ItemA.Id == 1
THEN ItemB.Id = 2
Update(ItemB)

Reguła 2

IF ItemB.Id == 2
THEN ItemB.Value = 100

Pomimo korzystania z funkcji Update w ten sposób nadal istnieje możliwość tworzenia scenariuszy pętli. Rozważmy na przykład następującą regułę:

IF ItemA.Id == 1
THEN ItemA.Value = 20
Update(ItemA)

Predykat używa elementu ItemA, więc aparat ponownie waliduje regułę, gdy aktualizacja jest wywoływana w elemencie ItemA. Jeśli wartość ItemA.Id nie zostanie zmieniona w innym miejscu, reguła 1 będzie nadal oceniać wartość true, co powoduje ponowne wywołanie aktualizacji w elemencie ItemA.

Jako projektant reguł należy unikać tworzenia takich scenariuszy pętli. Odpowiednie podejście do rozwiązania tego problemu różni się w zależności od charakteru reguł.

W poniższym przykładzie pokazano prosty sposób rozwiązania problemu w poprzednim przykładzie przez dodanie sprawdzenia elementu ItemA.Value , które uniemożliwia ponowne obliczenie reguły jako true po wykonaniu akcji reguły po raz pierwszy.

IF ItemA.Id == 1 and ItemA.Value != 20
THEN ItemA.Value = 20
Update(ItemA)

Aktualizowanie jednostki TypedXmlDocument

  1. W oknie Eksplorator zestawu reguł znajdź i wybierz odpowiednią regułę.

  2. W okienku THEN w obszarze Akcje dodaj wbudowaną funkcję Update jako akcję.

  3. W oknie Eksplorator faktów wybierz pozycję Schematy XML.

  4. Na karcie Schematy XML przeciągnij węzeł jednostki, który ma zostać argumentem w funkcji Update.

Załóżmy na przykład, że masz następujące reguły:

  • Reguła 1 oblicza łączną liczbę elementów w komunikacie zamówienia zakupu.

    IF 1 == 1
    THEN ProcessPO.Order:/Order/Items/TotalCount = (ProcessPO.Order:/Order/Items/TotalCount + ProcessPO:/Order/Items/Item/Count)  
    
  • Reguła 2 ustawia stan na "Wymaga zatwierdzenia", jeśli łączna liczba jest większa lub równa 10.

    Reguła 2

    IF ProcessPO.Order:/Order/Items/TotalCount >= 10
    THEN ProcessPO.Order:/Order/Status = "Needs approval"
    

Jeśli przekażesz następujący komunikat zamówienia zakupu jako dane wejściowe tego zestawu reguł, zauważysz, że stan nie jest ustawiony na "Wymaga zatwierdzenia", mimo że wartość TotalCount to 14. Takie zachowanie występuje, ponieważ reguła 2 jest obliczana tylko na początku, gdy wartość TotalCount wynosi 0. Reguła nie jest obliczana za każdym razem, gdy wartość TotalCount jest aktualizowana.

<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>

Aby aparat przeliczył warunki za każdym razem, gdy funkcja TotalCount jest aktualizowana, należy wywołać funkcję Update w węźle nadrzędnym (elementy) dla zaktualizowanego węzła (TotalCount). Jeśli zmienisz regułę 1 w następujący sposób i przetestujesz regułę jeszcze raz, pole Stan zostanie ustawione na "Wymaga zatwierdzenia":

Reguła 1 (zaktualizowana)

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)