在 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());
}
我已经浏览了 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());
}