2011-08-09 3 views
2

短いバージョン:プロセス変数を読み込んで更新するDRLファイルをJBPM5ルールノードに使用させるにはどうすればよいですか?JBPM 5のルールタスクからプロセスインスタンスにアクセス

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

[スタート] ---> [ルールノード] ---> [ゲートウェイ(発散する)] ...など

ゲートウェイが変数に制約を使用しています'isValid'という名前です。

マイルールのノードが一つだけのルールが含まれRuleFlowGroup「検証」を指している

:だから

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"行が実行されていないか、間違ったものを更新していると仮定します。

私は私の問題は、公式ドキュメントでは、この声明に関連していると思う:

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

しかし、私はここに記載されている方法を理解することはできません。プロセスインスタンスをこの最初のルールノードにアクセスできるように作業メモリに追加するにはどうすればよいですか?ルール・ノードは入力時の動作をサポートしていないようで、Javaコードに追加することはできません。の前にプロセスがルール・ノードの実行を非常に簡単に完了できるためです。StartProcess() を呼び出した後、それを挿入する - - ((kcontext.getProcessInstanceを挿入」を使用して、それを挿入するためにアクションスクリプトを使用して)( :あなたが述べたように

答えて

2

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

もしstartProcess()の呼び出しがすでにルールタスク(あなたの例ではそうかもしれません)を行っている可能性があり、ルールタスクの前に別のノードがありません(これは隠されているので)これを行うには、エントリタスクの前に明示的なスクリプトタスクを使用することをお勧めします。

Kr

+0

ありがとうKris、これを明示的に行うスクリプトタスクを追加すると問題が解決しました。プロセスがルールノードへのエントリ時に作業メモリに自動的に追加されない理由はありますか?プロセス変数にアクセスできないルールノードにはほとんど利益がないと思われ、これらの命令をプロセスに追加すると、実際のビジネス意思と実行環境が混ざり合っているようです... – Erica

関連する問題