ステートレス ナレッジ セッションとステートフル ナレッジ セッションの違いは何ですか。どちらも状態が維持されているドキュメントを読みましたが、ステートレス/ステートフル ナレッジ セッションはいつ使用できますか。
8 に答える
ステートレス: ファクト/ワーキング メモリは、ルールを起動する前にナレッジ ベース セッションに挿入されます。これらのファクトは、ルールの実行中にオブジェクトでパブリック メソッドを呼び出すことによって設定できます。設定後、これらのオブジェクトは変更された値で返されます。
insert(xyz)
や などのルールの実行中にファクトが変更されmodify(xyz)
ても、ルール エンジンには認識されません。
ステートフル: ファクト/ワーキング メモリは、ルールを起動する前にナレッジ ベース セッションに挿入され、ルールが起動された後、メモリ リークを回避するために dispose() を呼び出す必要があります。
insert(xyz)
や などのルールの実行中にファクトが変更されるmodify(xyz)
と、ルール エンジンに通知されます。
ステートレスとは、リクエストごとに新しいセッションが作成されることを意味します (したがって、状態は維持されません)。ステートフルとは、前のコマンドが終了したときのセッションの状態から続行することを意味します (たとえば、セッションに挿入されたすべてのデータはそのまま残ります)。
私が見る基本的な違いは、セッションがステートレスで自動破棄される方法です。どちらか一方を選択しても、パフォーマンスが向上することはありません。実際には、ステートレス セッションはその背後でステートフル セッションを使用します。だから図に行く!
1) ステートレス ナレッジ セッションの場合、ルールの実行中、つまり fireRules メソッドが呼び出されると、挿入されたファクト (then 部分) の変更はルール エンジンで使用できません。ステートフル ナレッジ セッションの場合、ファクトの変更はルール エンジンで利用できます。
2) ルールが起動されると、ステートフル ナレッジ セッション オブジェクトはメソッド dispose() を呼び出してセッションを解放し、メモリ リークを回避する必要があります。
3) ステートフル ナレッジ セッションの場合、ファクトへの変更はすべてルール エンジンで利用できます。したがって、ルールは繰り返し呼び出されます。ファクト A が DRL の最後のルールで変更された場合、この変更によってすべてのルールが再度有効になり、ファクト A に基づいて構築されたルールが起動されます。これはステートレス ナレッジ セッションには当てはまりません。
隠された事実は、ステートレス セッションがその背後でステートフル セッションを使用することです。