2

短いバージョン: プロセス変数を読み取って更新する DRL ファイルを使用するように JBPM5 ルール ノードを取得するにはどうすればよいですか?

長いバージョン: JBPM5 で実行されるプロセス定義があります。このプロセスの開始は次のようになります。

[開始] ---> [ルール ノード] ---> [ゲートウェイ (分岐)] ... etc

ゲートウェイは、「isValid」という名前の変数に制約を使用します。

私のルール ノードは、1 つのルールのみを含む RuleFlowGroup 'validate' を指しています。

rule "Example validation rule"
    ruleflow-group "validate"

    when
        processInstance : WorkflowProcessInstance()
    then
        processInstance.setVariable("isValid", new Boolean(false));
end

したがって、私の論理では、これが正しく処理されている場合、ゲートウェイは常に「false」パスをたどる必要があります。

私のJavaコードには、次のようなものがあります。

KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource("myProcess.bpmn"), ResourceType.BPMN2);
kbuilder.add(ResourceFactory.newClassPathResource("myRules.drl"), ResourceType.DRL);

KnowledgeBase            kbase    = kbuilder.newKnowledgeBase();
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();

new Thread(new Runnable()
   {
      public void run()
      {
         ksession.fireUntilHalt();
      }
   }).start();

// start a new process instance
Map<String, Object> params = new HashMap<String, Object>();
params.put("isValid", true);
ksession.startProcess("test.processesdefinition.myProcess", params);

次のことを確認できます。

  • ファイルに構文エラーを入れるとエラーが発生するため、drl ファイルが作業メモリに読み込まれます。
  • Java params マップに「isValid」の値を含めると、プロセスは Java によって指定されたパスのみをたどり、明らかに drools ルールを無視します。
  • 「isValid」パラメータを params マップから取り出すと、実行時エラーが発生します。

このことから、ルールの最後の「setVariable」行が実行されていないか、間違ったものを更新していると思います。

私の問題は、公式ドキュメントの次のステートメントに関連していると思います。

ルール制約は、プロセス内で定義された変数に直接アクセスできません。ただし、プロセス インスタンスをワーキング メモリに追加し、ルール制約内のプロセス インスタンスと照合することで、ルール制約内の現在のプロセス インスタンスを参照することができます。タイプ WorkflowProcessInstance の変数 processInstance が現在のプロセス インスタンスにのみ一致し、ワーキング メモリ内の他のプロセス インスタンスには一致しないようにする特別なロジックを追加しました。ただし、プロセス インスタンスをセッションに挿入し、場合によってはそれを更新する責任があることに注意してください。たとえば、Java コードを使用するか、プロセスの開始時または終了時または明示的なアクションを使用します。

ただし、ここで説明されていることを行う方法がわかりません。この最初のルール ノードにアクセスできるように、プロセス インスタンスをワーキング メモリに追加するにはどうすればよいですか? ルール ノードはエントリ時の動作をサポートしていないようです。プロセスを含めるように作業メモリが更新される前に、プロセスがルール ノードの実行を非常に簡単に完了する可能性があるため、ルール ノードを Java コードに追加することはできません。

4

1 に答える 1

2

前述のように、プロセス インスタンスをワーキング メモリに挿入するには、いくつかのオプションがあります。

startProcess() の呼び出しがすでにルール タスクを通過している可能性があり (これはおそらくあなたの例の場合です)、ルール タスクの前に別のノードがなく、エントリ/終了スクリプトを使用できます。これを行うには (それが非表示になるように)、ルール タスクの前に明示的なスクリプト タスクを使用することをお勧めします。

クリス

于 2011-08-10T13:06:09.613 に答える