网上有一些相关文章通常是查询历史表获取已完成的任务,然后通过流程模型判断连接到任务的flow,形成一个flowList,最后使用我前面文章提到的DefaultProcessDiagramGenerator来生成流程图。这种方式有个问题,就是如果一个任务连接了多个节点,流程不一定是从哪个节点过来的,导致的结果就是高亮流程路径并不准确(一个任务完成会把所有连接到该任务的所有路径都高亮显示),我们希望只高亮流程真正经过的路径。
针对上面的问题,下面是我自己的一个解决方案。
使用Listener记录每一步的流程路径
我们可以创建一个Activiti的监听Listener,监听一些Activiti的特殊事件,然后把流程相关信息保存记录到我们自定义的数据库表中。针对记录流程路径我们需要监听SEQUENCEFLOW_TAKEN事件。
创建SequenceFlowTakenEventListener并实现ActivitiEventListener接口,大致代码如下:
@Override
public boolean isFailOnException() {
return false;
}
@Override
public void onEvent(ActivitiEvent event) {
if (ActivitiEventType.SEQUENCEFLOW_TAKEN == event.getType()) {
ActivitiSequenceFlowTakenEvent sequenceFlowTakenEvent = (ActivitiSequenceFlowTakenEvent) event;
String id = sequenceFlowTakenEvent.getId();//路径id
String source = sequenceFlowTakenEvent.getSourceActivityId();//源id
String sourceName = sequenceFlowTakenEvent.getSourceActivityName();
String target = sequenceFlowTakenEvent.getTargetActivityId();//目标id
String targetName = sequenceFlowTakenEvent.getTargetActivityName();
String procInstId = sequenceFlowTakenEvent.getProcessInstanceId();//实例id
String procDefId = sequenceFlowTakenEvent.getProcessDefinitionId();//定义id
String exeId = sequenceFlowTakenEvent.getExecutionId();//执行id
//do some save operation
}
}
上面代码只写了部分字段,还有一些其他字段可以根据自己需要获取。保存代码就省略了,保存路径后,再次生成高亮流程图时,查询使用保存的路径id即可,这样可以绝对的保证高亮的路径肯定是流程执行过的(可以使用实例id来进行查询)。
实际应用场景你可能需要对上面代码进行封装,以便获得更好的通用性。