提问者:小点点

在JBPM脚本任务中,我可以访问流程变量上次更新的信息吗?


我已经搜索了JBPM 7留档,但很难找到解决方案。

在我的JBPM过程中(特别是在脚本任务过程-语言Java中),我需要访问上次更新的过程变量,并根据该值做出决定,即如果值大于2小时,则执行另一个操作。有人知道上次更新时是否/如何访问过程变量吗?

我可以使用以下方式访问过程变量值

String status = kcontext.getVariable("overallStatus"));

这将返回overallStatus流程变量的值,但我似乎无法掌握最后的修改时间(重要的是在脚本任务中!),我知道该信息是根据流程变量存储的,因为它显示在业务流程GUI中:


共2个答案

匿名用户

我知道一个使用自定义workItemHandler的解决方案,我将在下面提供详细信息,希望您可以用自定义workItemHandler替换脚本任务。对于给定的processVariable,可以从AuditLogService中获得VariableInstanceLog对象的列表,从这些审计对象中的每一个,可以访问最后的修改日期。

然后可以在将结果传递给流程实例的自定义workItemHandler中实现所需检查的逻辑。

下面是一段代码示例,它将打印出当前流程实例中名为“TheResult”的流程变量的最后修改日期。

public class CustomWorkItemHandler extends AbstractWorkItemHandler {

 private AuditLogService auditLogService; 

public CustomWorkItemHandler(KieSession ksession) {
    super(ksession);
}

public void executeWorkItem(WorkItem workItem,
                            WorkItemManager manager) {
  
        // sample parameters
        String sampleParam = (String) workItem.getParameter("SampleParam");
        String sampleParamTwo = (String) workItem.getParameter("SampleParamTwo");

        // complete workitem impl...
        
        auditLogService = new JPAAuditLogService(getSession().getEnvironment());
        
        //TheResult - is the process variable to check
        List<VariableInstanceLog> list = auditLogService.findVariableInstances(workItem.getProcessInstanceId(), "TheResult");
        if (list.size() > 0){
            VariableInstanceLog log = list.get(list.size()-1);
            System.out.println("Last Recorded Date:" + log.getDate());
        }
        
        // return results
        String sampleResult = "A result to return here";
        Map<String, Object> results = new HashMap<String, Object>();
        results.put("SampleResult", sampleResult);


        manager.completeWorkItem(workItem.getId(), results);
   
}

@Override
public void abortWorkItem(WorkItem workItem,
                          WorkItemManager manager) {
    // stub
}

}

您需要通过Business-Central将打包的自定义workItemHandler jar添加为工件,并注册您的workItemhandler,将ksession传递给项目中的构造函数-

HandlerNameHere -- new org.jbpm.contrib.CustomWorkItemHandler(ksession) -- MVEL

有关使用maven原型构建自定义WorkItemHandler的更多详细信息,请参见此处 http://mswiderski.blogspot.com/2018/04/jbpm-work-items-are-really-simple.html 要将CustWorkItemHandler合并到您的流程中,请参阅此简短视频 https://www.youtube.com/watch?v=_XIZ0KRTahE

匿名用户

除了上面的答案之外,还可以使用以下Java语法在脚本任务中访问所需的信息

org.jbpm.process.workitem.core.AbstractWorkItemHandler wih;

System.out.println("Ping");

org.kie.api.runtime.KieSession session = (org.kie.api.runtime.KieSession)kcontext.getKieRuntime();
org.jbpm.process.audit.AuditLogService auditLogService = new 
org.jbpm.process.audit.JPAAuditLogService(session.getEnvironment());
System.out.println("auditLogService="+auditLogService);

java.util.List<org.jbpm.process.audit.VariableInstanceLog> list = auditLogService.findVariableInstancesByName("status", true);
for (org.jbpm.process.audit.VariableInstanceLog v :list) {
    System.out.println("value="+v.getValue()+", date:"+v.getDate().toString());
}