springboot 集成 activiti 流程引擎

springboot 集成 activiti 流程引擎,第1张

Java代码0202

List<Task02tasks02=02taskServicecreateTaskQuery()processInstanceId(procInstanceId)list();0202

然后根据当前任务获取当前流程的流程定义,然后根据流程定义获得所有的节点:02

Java代码0202

ProcessDefinitionEntity02def02=02(ProcessDefinitionEntity)02((RepositoryServiceImpl)rs)getDeployedProcessDefinition(taskgetProcessDefinitionId());02020202List<ActivityImpl02activitiList02=02defgetActivities();0202

//rs是指RepositoryService的实例0202根据任务获取当前流程执行ID,执行实例以及当前流程节点的ID:02

Java代码0202

String02excId02=02taskgetExecutionId();0202

ExecutionEntity02execution02=02(ExecutionEntity)02runtimeServicecreateExecutionQuery()executionId(excId)singleResult();0202

String02activitiId02=02executiongetActivityId();0202

然后循环activitiList 并判断出当前流程所处节点,然后得到当前节点实例,根据节点实例获取所有从当前节点出发的路径,然后根据路径获得下一个节点实例:02

Java代码0202for(ActivityImpl02activityImpl:activitiList){0202

String02id02=02activityImplgetId();0202if(activitiIdequals(id)){0202

Systemoutprintln(

"当前任务:"

+activityImplgetProperty("name"));02//输出某个节点的某种属性0202List<PvmTransition02outTransitions02=02activityImplgetOutgoingTransitions();

//获取从某个节点出来的所有线路0202for(PvmTransition02tr:outTransitions){0202

PvmActivity02ac02=02trgetDestination();02

//获取线路的终点节点0202Systemoutprintln("下一步任务任务:"

公司业务需求要求显示流程图的执行的线路高亮

然后就开始了漫长的复制粘贴之旅

因为activiti不会对走过Flow进行记录,只对活动做记录,基本思路就是通过historyService可以获取到所有的HistoricActivityInstance,然后通过活动顺序再获取到执行过的flowId

但是这里有一个巨坑,这个HistoricActivityInstance是无序的,里面并没有字段可以对其进行排序,网上有很多文章说是用开始时间进行排序

但这是根本就是扯淡,开始时间根本不能排序,因为很多活动都是一瞬间完成的,开始时间是完全相同的,比如开始事件和第一个活动,比如排他网关和执行的下一个活动,所以根本无法排序,同理结束时间也无法进行排序。

还有很多文章写了很复杂的算法来获取到执行过的线路,但是都是没有用,不是少了就是多了。

最后仔细的研究了HistoricActivityInstance这个类,发现其实是有规律的,那就是一个活动结束的时间是和下一个执行的活动的开始时间,如果当前Activity的结束时间和下一个Activity的开始时间相等两个活动中间的Flow就走过,知道原理就好办了。

在流程资源文件中,每一个节点元素在activiti中都有对应的元素属性承载类,比如,UserTask任务节点,它的元素属性承载类为UserTask,相同,startEvent开始节点的元素承载类为StartEvent,在bpmn流程文件进行解析时,也是将xml文档中每个元素解析为对应的承载类,从而进行组装成一个BmpnModel模型,我们可以直接由activiti将bpmn xml文件解析为一个实例模型(下图所示),也可以完成通过自定义手动创建模型。

关于模型校验器更多细节可查看 activiti源码剖析之BpmnModel模型校验器

流程节点上别指定具体人,使用${userId}变量的方式。

在上一节点的添加TaskListener,完成事件,对userId进行设置。

public class AssigneeSearch2 implements TaskListener {

public void notify(DelegateTask delegateTask) {

String userId = delegateTaskgetVariable("applyUserId")toString();

if ("user01"equalsIgnoreCase(userId) ) {

delegateTasksetVariable("userId", "leaderuser");

}

}

}

}

以上就是关于springboot 集成 activiti 流程引擎全部的内容,包括:springboot 集成 activiti 流程引擎、工作流Activiti表说明、ACTIVITI如何获取下一步节点求解答等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9266667.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存