it-swarm.com.de

Drools: zustandslose oder zustandsbehaftete Wissenssitzung

Was ist der Unterschied zwischen zustandslosen und statusbehafteten Wissenssitzungen? Ich habe einige Dokumente gelesen. Beide werden im Status beibehalten. Aber wann kann ich zustandslose/statusbehaftete Wissenssitzungen verwenden?.

11
tech2504

Statuslos: Der Fakten-/Arbeitsspeicher wird vor dem Auslösen von Regeln in die Knowledge Base-Sitzung eingefügt. Diese Fakten können festgelegt werden, indem öffentliche Methoden für ein Objekt aufgerufen werden, während Regeln ausgeführt werden, und nachdem diese Objekte festgelegt wurden, werden sie mit geänderten Werten zurückgegeben.

Änderungen an den Fakten während der Ausführung von Regeln, z. B. insert(xyz) oder modify(xyz), werden der Regelengine nicht mitgeteilt.

Stateful: Der Fakten-/Arbeitsspeicher wird vor dem Auslösen von Regeln in die Knowledge Base-Sitzung eingefügt. Nach dem Auslösen der Regeln muss dispose () aufgerufen werden, um Speicherlecks zu vermeiden.

Alle Änderungen an den Fakten während der Ausführung von Regeln, z. B. insert(xyz) oder modify(xyz), werden der Regelengine mitgeteilt.

16
Prakhyat

Zustandslose Sitzung, die den einfachsten Anwendungsfall darstellt und keine Inferenz verwendet. Eine zustandslose Sitzung kann wie eine Funktion aufgerufen werden, die einige Daten übergibt und dann einige Ergebnisse zurückerhält. Stateful-Sitzungen dauern länger an und ermöglichen iterative Änderungen im Laufe der Zeit.

Bei stateful session wird der Arbeitsspeicher auf Änderungen der Fakten überwacht. Änderungen an den Fakten führen dazu, dass die Bewertungsphase von Regeln erneut ausgeführt wird, was wiederum dazu führen kann, dass eine Regel für die Aktivierung geplant wird.
Im Fall von zustandsloser Sitzung reagiert es nicht auf Änderungen der Fakten,
Nacherfüllung.

Im Fall von stateful session muss die Methode dispose() aufgerufen werden, wenn Sie mit einer stateful session fertig sind, es sei denn, Sie verwenden den RuntimeManager/RuntimeEngine, um Ihre KieSession abzurufen.
Zustandslose Sitzung erfordert keinen Aufruf der Methode dispose().

Im Fall von stateful session bietet es eine Vielzahl von Methoden, um den Motor zum "Feuern" zu bringen (d. H. Die Konsequenzen der für die Aktivierung geplanten Regeln auszuführen).

   fireAllRules()                                           
   fireAllRules(AgendaFilter filter)                           
   fireAllRules(AgendaFilter filter, int max)                 
   fireAllRules(int max)                      
   fireUntilHalt() 
   fireUntilHalt(AgendaFilter filter)  

Im Falle von zustandslose Sitzung wird die Engine durch einen Aufruf von 1 "gezündet"
der execute() Methoden. Die zwei Varianten sind; 1) ein einzelnes Objekt/Fakt übergeben oder 2) ein iterierbares Objekt übergeben, das die zu verwendenden Fakten enthält.

Im Fall von stateful session stehen dem Regelmodul Änderungen an Fakten zur Verfügung. Wenn also eine Regel für einen bestimmten Fakt geändert wird, werden durch diese Änderung alle Regeln erneut aktiviert und die darauf aufbauenden Regeln ausgelöst geänderte Tatsache.
Im Fall von zustandsloser Sitzung werden Änderungen an den Fakten während der Ausführung von Regeln nicht an die Regel-Engine gemeldet. Wenn also eine Regel geändert wird, werden die Regeln nicht erneut aktiviert.

Diese Unterschiede zu Beispielen werden in diesem Artikel erklärt: Drools Stateful vs Stateless post

9
Rameez

Ohne Status bedeutet, dass für jede Anforderung eine neue Sitzung erstellt wird (sodass kein Status beibehalten wird). Statusbehaftet bedeutet, dass der Vorgang von dem Status aus fortgesetzt wird, in dem die Sitzung zum Zeitpunkt des letzten Befehls beendet wurde (z. B. sind alle in die Sitzung eingefügten Daten noch vorhanden).

6
Kris Verlaenen

Der grundlegende Unterschied, wie ich es sehe, ist die Art und Weise, wie die Sitzung automatisch zustandslos angeordnet wird. Es ist kein Leistungsgewinn zu verzeichnen, wenn Sie sich für ein Produkt entscheiden. Tatsächlich verwendet die zustandslose Sitzung eine zustandsbehaftete Sitzung dahinter. Also mach mit!

5
Kingz

Ein vollständiges Beispiel für den Unterschied finden Sie unter dem folgenden Link. Nachdem ich das gesehen hatte, konnte ich es einfach verstehen.

http://www.javainuse.com/drools_states

1
Maralc

Ich möchte hier die Sabberdokumentation zitieren, die mir den Kopf frei gemacht hat.

"StatelessKnowledgeSession bietet eine praktische API, die StatefulKnowledgeSession umschließt. Sie vermeidet die Notwendigkeit, dispose () aufzurufen. Stateless-Sitzungen unterstützen keine iterativen Aufrufe. Der Aufruf von execute (...) ist eine Single-Shot-Methode, die eine StatefulKnowledgeSession intern instanziiert. fügen sie alle benutzerdaten hinzu und führen sie benutzerbefehle aus, rufen sie fireAllRules auf und rufen sie dann dispose () auf. "

Im Grunde ist eine zustandslose Sitzung eine zustandsbehaftete Sitzung, die einmal verwendet wird.

Dies impliziert dann, dass zustandslose Sitzungen auch Rückschlüsse ziehen können, im Gegensatz zu vielen Dokumenten und einigen hier genannten Antworten! Dies sollte nur vom "dann" -Teil der Regel abhängen, ob Sie "Ändern" verwenden oder nicht.

Obwohl ich dies selbst nicht überprüft habe, scheint dieser Beitrag meine Überlegungen zu stützen.

https://groups.google.com/forum/#!topic/drools-usage/qYbqiS1ht4g

1
Haijin

1) Im Fall einer zustandslosen Wissenssitzung, während die Regelausführung ausgeführt wird, d. H. Sobald die fireRules-Methode aufgerufen wird, ist die Änderung der eingefügten Fakten (im then-Teil) für die Regelengine nicht verfügbar. Im Falle einer Stateful Knowledge Session stehen alle Änderungen der Fakten der Regelengine zur Verfügung.

2) Sobald Regeln ausgelöst wurden, muss das Objekt Stateful Knowledge Session die Methode dispose () aufrufen, um die Sitzung freizugeben und Speicherlecks zu vermeiden.

3) Im Falle einer Stateful Knowledge Session stehen alle Änderungen an Fakten der Regel-Engine zur Verfügung. Die Regeln werden also iterativ aufgerufen. Wenn Fakt A in der letzten Regel der DRL geändert wird, werden durch diese Änderung alle Regeln erneut aktiviert und die Regeln ausgelöst, die auf Fakt A aufbauen. Dies ist bei zustandslosen Wissenssitzungen nicht der Fall.

Die verborgene Tatsache ist, dass die zustandslose Sitzung eine zustandsbehaftete Sitzung verwendet

0
chammu

In Stateful-Sessions können wir Fakten ändern und erneut einfügen, auch nachdem die Regeln zuvor ausgelöst wurden.

In zustandslosen Sitzungen hingegen können wir nach dem Auslösen aller Regeln (mit execute()) die Fakten nicht mehr weiter modifizieren und in die Sitzung einfügen (da die Sitzung nach dem Aufrufen von execution() unbrauchbar wird).

0