我已经搜索了JBPM 7留档,但很难找到解决方案。
在我的JBPM过程中(特别是在脚本任务过程-语言Java中),我需要访问上次更新的过程变量,并根据该值做出决定,即如果值大于2小时,则执行另一个操作。有人知道上次更新时是否/如何访问过程变量吗?
我可以使用以下方式访问过程变量值
String status = kcontext.getVariable("overallStatus"));
这将返回overallStatus流程变量的值,但我似乎无法掌握最后的修改时间(重要的是在脚本任务中!),我知道该信息是根据流程变量存储的,因为它显示在业务流程GUI中:
我知道一个使用自定义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());
}