当前位置: 首页 > 知识库问答 >
问题:

无法从DRL更新jbpm进程变量

陶高峯
2023-03-14
kcontext.getKnowledgeRuntime().insert(kcontext.getProcessInstance());
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

欢迎提出任何建议。

共有1个答案

卢英范
2023-03-14
  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 ########");
 类似资料:
  • 我试图将我的流程变量放入业务规则任务中,并在该任务中更改该变量,但值保持不变。我做错了什么?流程是在kie工作台中开发的,不使用Eclipse。 在触发规则之前,我的变量在脚本任务中初始化,如 谢谢你的帮助!

  • 借助脚本任务和kcontext实例,我可以成功地从流程内检索全局变量(如NodeInstance、ProcessInstance等);但如果我需要在WorkItem中检索这些全局变量呢?当然,我可以将脚本任务放在进程中我的工作项之前,然后将一个全局变量分配给其中一个变量定义,以便在带有getParameter()方法的工作项中使用它; 但我们确实明白,这是双重的,不是吗?那么,在没有额外脚本任务的

  • 我目前与JBpm Kie合作。我们有带有自定义工作项(和自定义工作项处理程序代码)的进程。我们发现调试代码非常困难,因为我们的工作项处理程序主要是异步的,并且是通过RESTAPI完成的。我了解到,可以通过maven存储库向KIE引擎提供workItem处理程序(我对maven很陌生)。我很想知道我是否可以将我的PC配置为Maven存储库,并根据jBpm进程的请求调试代码。有可能吗?

  • 如何使同一进程的多个实例在不相互干扰的情况下并排运行? 我有一个业务流程模型,其中一个基本工作流需要决定需要启动哪个其他工作流。这个基流将在被评估时发送一些信号,这些信号将启动其他子进程。在这些子进程的执行过程中,有些子进程需要等待其他子进程完成。因此,我目前使用中间抛出和捕捉信号来实现某种同步机制。问题是,每当某个信号被发送时,侦听该信号的所有进程都将继续独立于它们运行的实例。我希望只有当这些子

  • 问题内容: 我有主GUI线程,其中有一个JprogressBar,并且正在实现ProprtyChangeListener。 当按下按钮时,扩展SwingWorker的其他类将开始执行并执行一系列可能很长的计算。我需要A类中的进度条以根据B类中的变量来呈现进度。 我的代码在下面(我所有失败的尝试都可能有点混乱…) 将不胜感激。 GUI类别: 计算类: 编辑 原始问题仍然存在。出于某种原因,进度条仍然