Drools deaktiviert eine Regel zur Laufzeit

8

Ich beginne ein Projekt mit Drools and Drools Guvnor.

Meine Regeln werden in drools guvnor implementiert. Meine Regelengine-Instanz kann auf diese Regeln über die pkg-Datei zugreifen, die von Drools Guvnor angezeigt wird, wenn Sie eine Paketfreigabe erstellen und freigeben.

Das funktioniert alles gut. Ich suche nach einer Lösung, um eine Regel zur Laufzeit zu deaktivieren.

Die einzige Lösung, die ich gerade habe, ist, nach Guvnor zu gehen, die Regel zu archivieren und Build + Release des Pakets zu machen, das diese Regel enthält.

Gibt es keine andere Strategie?

    
Frederic Close 31.05.2012, 11:34
quelle

2 Antworten

5

Je nach Ihren Anforderungen und Ihrer Architektur gibt es mehrere Möglichkeiten, dies zu lösen.

  • Eine Möglichkeit besteht darin, jede Teilmenge Ihrer Regeln in verschiedenen GUVNOR-Paketen zu definieren. Wenn Sie Ihre kbase erstellen, können Sie nur die Pakete mit den Regeln laden, die Sie speziell für diese kbase wünschen.

  • Eine andere Möglichkeit, ist, immer alle Regeln zu laden, aber ein „enabled“ Ausdruck verwenden Sie ermöglichen dynamisch / deaktivieren Regeln. Bitte beachten Sie, dass die Regeln in diesem Fall noch ausgewertet werden, jedoch verhindert werden können, dass sie aktiviert werden. Dies ist eine nützliche Methode für Fälle, in denen Sie Regeln basierend auf den Fakten aktivieren / deaktivieren möchten, die Sie in Ihre Sitzung einfügen. Zum Beispiel:

    Regel X     aktiviert( ) dann ...

    Der Boolesche Ausdruck hat über den Zugriff auf die Variablenbindungen aus dem Zustand der Regel sowie Regel Attribute, Anmerkungen und natürlich können Sie auch statische Methoden in Helper-Klassen zugreifen, wenn Sie die Bedingungen zur Aktivierung der Regel definieren mögen externe in die DRL-Datei.

  • Ein dritter Weg, dies zu tun, ist die Verwendung von Agendafiltern. In diesem Fall laden Sie alle Ihre Regeln, erstellen die Sitzung mit den Fakten und verwenden bei der Ausführung der Regeln einen Agenda-Filter. Ein Agendafilter ist eine Schnittstelle, die Sie selbst implementieren können, oder Sie können einige der Filter verwenden, die mit Drools ausgeliefert werden. Der Filter wird aufgerufen, bevor jede Regel ausgelöst wird, und kann dann das Veto einlegen oder zulassen, dass die Engine die Regel ausführt. Bitte beachten Sie, dass in diesem Fall alle Regeln ausgewertet und aktiviert werden, aber nur die Regeln ausgelöst werden, die der Filter auslösen darf. Zum Beispiel, wenn Sie nur die Regeln feuern wollen, die einen Namen haben, der mit „X“ beginnen, können Sie die folgende Codezeile verwenden:

    ksession.fireAllRules (neu RuleNameStartsWithAgendaFilter ( "x"));

    Weitere Informationen finden Sie hier:

    Ссылка

    Hier ist die Dokumentation (Scrollen Sie bis zum Thema 3.3.3.4.1):

    Ссылка

Edson Tirelli 01.06.2012, 16:13
quelle
0

Sie können die Existenz einer bestimmten Tatsache im Arbeitsspeicher hinzufügen. Etwas wie:

%Vor%

und deaktivieren Sie die Regel in Java-Code:

%Vor%     
Cyril Sochor 31.05.2012 22:48
quelle

Tags und Links