欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

4.判断jbpm流程实例流转完毕

程序员文章站 2022-04-28 21:04:57
...

在使用jbpm4.x进行业务实例开发中,最后遇到了如何判断流程实例运转结束判断的问题。

 

当业务实例相对应的流程实例运转完毕之后,相应的,需要对业务实例信息做状态标记,表示该业务实例信息已经形成了最终的流程审批意见,可以根据具体的结果进行相应的任务处理。

 

这样,就涉及到了如何判断流程实例已经运转完成的判断。当然,根据现在的实际开发情况,需要写出一个公用的接口方法,用于判断某流程已经结束,而不是针对某具体流程来独立编写代码来完成。

 

在jbpm4.x之前的版本,有专门的API来做判断:

 

ProcessInstance processInstance = executionService.findProcessInstanceById(processInstanceId);
if (processInstance != null) {
	return processInstance.isEnded();
}

 

 

但是在JBPM4.x之后,加入了历史流程处理,将已经流转完毕的流程实例数据全部移入相对应的历史资源记录表中。流程信息表中,只保留当前运转信息,提高流程实例运行效率。

 

这样产生的问题就是,当流程实例完成之后,通过 executionService.findProcessInstanceById(processInstanceId)来获取流程实例,是根本不会获取到对应的流程实例的,因为对应的信息已然不存在,如果执行相应的isEnded方法,只会获得一个空指针异常信息。

 

这样,就只有到历史表中,去查找相应的流程实例信息了。但是当获取到对应流程实例信息之后,问题也来了。jbpm4.x的处理方式是,当启动一个流程实例后,在流程实例信息表中,和对应历史表中,都会有相应的一条流程实例信息。

 

这样意味着,即使你从历史信息中获取到了对应的流程信息,也不能就确认,该流程实例已经运转结束。而且历史流程实体对象中,没有提供相应的isEnded方法用来判断。

 

这样,只好自己动手来想办法来处理了。

 

第一种方式是判断历史流程实例中,结束时间是否已经赋值。

 

通过流程实例信息观察,发现,若历史流程实例已经完成流转,则对其流程实例信息中endtime(结束时间)记录时间信息,标记该流程完成时间。

 

这样,在获取流程实例之后,在判断该流程实例的endtime值是否为空,不为空,就可以判断该流程已经完成了运转。

 

historyProcessInstance.getEndTime() != null

 

第二种方法是判断历史流程实例的状态,这种方法显得更规范些。

 

HistoryProcessInstance类有一个静态实例属性 STATE_ENDED,不论流程实例最终走到了那个结束的节点,是否是正常结束,还是异常结束,只要该流程实例结束,最后的状态都可以该属性相匹配。

 

historyProcessInstance.getState().equals(HistoryProcessInstance.STATE_ENDED);

 

暂时就是这两种解决方法了。