ステートレスとステートフルのナレッジセッションの違いは何ですか。いくつかのドキュメントを読みましたが、どちらもステートが維持されていますが、ステートレス/ステートフルのナレッジセッションはいつ使用できますか。
ステートレス:ファクト/ワーキングメモリは、ルールを実行する前にナレッジベースセッションに挿入されます。これらのファクトは、ルールの実行中にオブジェクトのパブリックメソッドを呼び出すことで設定でき、設定後、これらのオブジェクトは変更された値で返されます。
insert(xyz)
やmodify(xyz)
などのルールの実行中のファクトの変更は、ルールエンジンに認識されません。
ステートフル:ファクト/ワーキングメモリは、ルールを起動する前にナレッジベースセッションに挿入され、ルールが起動された後、メモリリークを回避するためにdispose()を呼び出す必要があります。
insert(xyz)
やmodify(xyz)
などのルールの実行中にファクトが変更されると、ルールエンジンに認識されます。
推論を利用せずに、最も単純なユースケースを形成するステートレスセッション。ステートレスセッションは、関数のように呼び出すことができ、データを渡してから結果を受け取ります。ステートフルセッションは存続期間が長く、時間の経過とともに繰り返し変更できます。
ステートフルセッションの場合、ファクトの変更について作業メモリーを監視します。ファクトに変更を加えると、ルールの評価フェーズが再実行され、その結果、ルールのアクティブ化がスケジュールされる可能性があります。
ステートレスセッションの場合、事実の変化に応答しません、
実行後。
ステートフルセッションの場合、ステートフルセッションが終了したら、使用していない限り、dispose()
メソッドを呼び出す必要があります。 _RuntimeManager/RuntimeEngine
_のKieSession
を取得します。
ステートレスセッションでは、dispose()
メソッドを呼び出す必要はありません。
ステートフルセッションの場合、エンジンを「起動」させる(つまり、アクティブ化がスケジュールされたルールの結果を実行する)ためのさまざまなメソッドを提供します。
_ fireAllRules()
fireAllRules(AgendaFilter filter)
fireAllRules(AgendaFilter filter, int max)
fireAllRules(int max)
fireUntilHalt()
fireUntilHalt(AgendaFilter filter)
_
ステートレスセッションの場合、エンジンは1つの呼び出しを介して「起動」します。execute()
メソッドの。 2つのバリアントは次のとおりです。 1)単一のオブジェクト/ファクトを渡すか、2)使用されるファクトを含む反復可能なオブジェクトを渡します。
ステートフルセッションの場合、ファクトの変更はルールエンジンで利用できるため、特定のファクトに対してルールが変更された場合、この変更は再び行われます。すべてのルールをアクティブ化し、変更されたファクトに基づいて構築されたルールを実行します。
ステートレスセッションの場合、ルールの実行中のファクトの変更はルールエンジンに通知されないため、ルールが変更された場合他のルールの再アクティブ化は行われません。
例とのこれらの違いは、これで説明されています Drools Stateful vs Stateless post
ステートレスとは、リクエストごとに新しいセッションが作成されることを意味します(したがって、状態は維持されません)。ステートフルとは、前のコマンドが終了したときのセッションの状態から継続することを意味します(たとえば、セッションに挿入されたすべてのデータは引き続き存在します)。
私の見方の基本的な違いは、セッションがステートレスで自動破棄される方法です。どちらか一方を選択してもパフォーマンスが向上することはありません。実際、ステートレスセッションはその背後でステートフルセッションを使用します。だから図に行きます!
違いの完全な例は、以下のリンクにあります。それを見ただけで完全に理解できました。
私はここで私の心をクリアしたよだれのドキュメントを引用したいと思います。
「StatelessKnowledgeSessionは、StatefulKnowledgeSessionをラップする便利なAPIを提供します。dispose()を呼び出す必要がありません。ステートレスセッションは反復呼び出しをサポートしていません。execute(...)を呼び出す動作は、StatefulKnowledgeSessionを内部的にインスタンス化するシングルショットメソッドです。すべてのユーザーデータを追加してユーザーコマンドを実行し、fireAllRulesを呼び出してから、dispose()を呼び出します。」
つまり、基本的に、ステートレスセッションは1回使用されるステートフルセッションです。
これは、多くのドキュメントやここでの回答とは異なり、ステートレスセッションでも推論を実行できることを意味します。これは、「変更」を使用するかどうかに関係なく、ルールの「その後」の部分にのみ依存する必要があります。
私はこれを自分で確認していませんが、この投稿は私の推論をサポートしているようです。
https://groups.google.com/forum/#!topic/drools-usage/qYbqiS1ht4g
1)ステートレスナレッジセッションの場合、ルールの実行中、つまりfireRulesメソッドが呼び出されると、挿入されたファクト(その部分)の変更はルールエンジンで使用できません。ステートフルナレッジセッションの場合、ファクトの変更はルールエンジンで利用できます。
2)ルールが実行されると、ステートフルナレッジセッションオブジェクトはメソッドdispose()を呼び出して、セッションを解放し、メモリリークを回避する必要があります。
3)ステートフルナレッジセッションの場合、ファクトへの変更はルールエンジンで利用できます。したがって、ルールは繰り返し呼び出されます。ファクトAがDRLの最後のルールで変更された場合、この変更によりすべてのルールが再度アクティブになり、ファクトAに基づいて構築されたルールが実行されます。これはステートレスナレッジセッションには当てはまりません。
隠された事実は、ステートレスセッションがその背後にあるステートフルセッションを使用していることです
ステートフルセッションでは、以前にルールを実行した後でも、ファクトを変更して再挿入できます。
一方、ステートレスセッションでは、(execute()
を使用して)すべてのルールが実行されると、ファクトをさらに変更してセッションに再挿入することはできません(execution()
は)と呼ばれます。