1

drools ステートレス セッションのグローバル変数の設定方法。

2 つのスレッドが同じセッションにアクセスするが、各スレッドの新しい arraylist を使用してグローバル変数 customer arraylist を設定するとします。2 番目のスレッドの arraylist は、グローバル変数 customer の最初のスレッドの arraylist を置き換えますか?

それは StatelessKnowledgeSession クラスのドキュメントからのケースのようです:

StatelessKnowledgeSessions は、さまざまな方法でスコープが設定されたグローバルをサポートします。コマンドは特定の実行呼び出しに適用されるため、最初に非コマンドの方法について説明します。グローバルは 3 つの方法で解決できます。StatelessKnowledgeSession は、Globals インスタンスを返す getGlobals() をサポートしています。これらのグローバルはすべての実行呼び出しで共有されるため、これらの場合、変更可能なグローバルには特に注意してください。実行呼び出しは異なるスレッドで同時に実行されることが多いためです。グローバルは、グローバルを解決する 2 番目の方法を追加するデリゲートもサポートします。setGlobal(String, Object) の呼び出しは、実際には内部コレクションに設定されます。この内部コレクションの識別子は、指定されたデリゲートが追加されている場合、優先されます。内部コレクションで識別子が見つからない場合は、デリゲート グローバルをチェックします。

http://docs.jboss.org/jbpm/v5.1/javadocs/org/drools/runtime/StatelessKnowledgeSession.html

私は正しいですか?

4

2 に答える 2

0

私はあなたに完全に信頼できる答えを与えることはできませんが (私はこれをテストしていないため)、私はあなたが正しいと思います。

  1. StatelessKnowledgeSessionDrools は の内部でandを使用し、ステートフル セッションでは、 の呼び出しが前の呼び出しの値をオーバーライドするStatefulKnowledgeSessionことを期待します。setGlobal(...)

  2. グローバルは「グローバル ストア」に保持されます。このグローバル ストアはセッション固有です。つまり、異なるスレッドを使用して同じセッションに同時にアクセスする場合、1 つのスレッドが他のスレッドのグローバル ストアをオーバーライドしますsetGlobal(...)(最後に実行されたスレッドのいずれか)。

于 2013-03-13T14:52:56.807 に答える