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

In a JBPM script task can I access a process variables last updated information

我已经浏览了 JBPM 7 文档,但仍在努力寻找解决方案。

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

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

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

而这个 returns overallStatus 流程变量的值,但我似乎无法掌握最后修改时间(重要的是在脚本任务中!),我知道此信息存储在业务流程 GUI 中显示的流程变量:

我知道一个使用自定义 workItemHandler 的解决方案,我将在下面提供详细信息,希望您可以用自定义 workItemHandler 替换脚本任务。 可以从 AuditLogService 获取给定 processVariable 的 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 传递给项目中的构造函数->设置->部署->WorkItemHandlers 例如

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

有关使用 maven 原型构建自定义 WorkItemHandler 的更多详细信息,请参见此处 http://mswiderski.blogspot.com/2018/04/jbpm-work-items-are-really-simple.html 并将 customWorkItemHandler 合并到您的流程中,请参阅此短视频 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());
}