4

現在、jbpm/drools の使用を開始しており、「ビジネス ルール タスク」を使用して DRL からいくつかのプロセス変数を変更しようとしました。タイプ「MyCustomObject」の変数「var」を宣言したプロセスで次のことを試しました。

この質問この推奨事項の結果に従って、ruleflow-group「testgroup」を実行し、次の onEntry スクリプトを持つタスクを作成しました。

kcontext.getKnowledgeRuntime().insert(kcontext.getProcessInstance());

私の DRL は次のようになります。

import mypackage.MyCustomObject;
import org.kie.api.runtime.process.WorkflowProcessInstance;

rule "generate object"
ruleflow-group "testgroup"

when
  //some stuff applies
then
  insert(new MyCustomObject());
end

rule "modify variable"
ruleflow-group "testgroup" 

when
  $process: WorkflowProcessInstance()
  $obj: MyCustomObject()
then
  WorkflowProcessInstance $p = (WorkflowProcessInstance)kcontext.getKieRuntime().getProcessInstance($process.getId());
  $p.setVariable( "var", $obj);
  System.out.println("Value of object in memory: "+$obj);
  System.out.println("Value of object in variable:+$p.getVariable("var"));
  retract($process);
end

ビジネス ルール タスクの後に、単純なスクリプト タスクを配置しました。

if(var != null) {
  System.out.println("var: "+var);
} else{
  System.out.println("var is null!");  
}

私が得た出力は次のとおりです(注:MyCustomObjectはtoStringをオーバーライドしません):

メモリ内のオブジェクトの値: MyCustomObject@XYZ

変数内のオブジェクトの値: MyCustomObject@XYZ

var が null です。

この時点で、何が悪かったのかわかりません。出力からわかるように、ワーキング メモリ内の ProcessInstance は変数を正しく設定していますが、その値はプロセス自体には存在しません (したがって、他のノードがアクセスするため)。

追加情報:

現在、JBoss EAP 6.4 でワークベンチ バージョン 6.4.0.Final を使用しており、別の EAP 6.4 インスタンスで実行されている KieExecutionServer (6.4.0.Final) にコンテナーをデプロイしています。

任意の提案をいただければ幸いです。

4

1 に答える 1

0
  1. オブジェクト型の qrr という名前の変数をプロセスに追加します

ビジネス・ルール・タスクの onEntry スクリプトで:

// Add the process instance into working memory so we can access it from rules!!!
insert(kcontext.getProcessInstance());

// get the current process context (the running process) where I have already
// defined a variable named qrr as a type Object.
org.jbpm.workflow.instance.WorkflowProcessInstance pi = (org.jbpm.workflow.instance.WorkflowProcessInstance)kcontext.getProcessInstance();
    
// create a new array list
qrr = new java.util.ArrayList();

// to be able to access qrr from the business process I set the new qrr
// instance to the BP variable named qrr
pi.setVariable("qrr", qrr);

// log to log file    
System.out.println("=======> qrr inserted ");

ルールの例

rule "check states"
ruleflow-group "build-results"
dialect "java"
when
  /* when there is an object of type PatientState with an attribute named trasferrable(boolean) equals to true in the working memory */
  $s : PatientState(trasferrable==true)
then
  
  String str = "We found our PatientState in working memory and it has transferable==true!";
    
  /* get the process context we inserted into the working memory before we ran our business rule task with ruleflow: build-results */
  Object o = drools.getContext(org.kie.api.runtime.process.ProcessContext.class);
    
  if (o != null) {
    // we found the ProcessContext in working memory so cast it and than get our variable named qrr and cast it as well
    List qrr = (List)drools.getContext(org.kie.api.runtime.process.ProcessContext.class).getVariable("qrr");
    // add the string object to the list
    qrr.add(str);
  }
  else {
    LoggerUtil.info("Context not found in working memory");
  }
end

onExit スクリプト
で次のように記述します。

System.out.println("######## qrr contains: " + qrr.size() + " rule results ########");

HTH、
ギャル

于 2016-09-06T14:06:38.193 に答える