《jbpm5 持久化及流转流程剖析.docx》由会员分享,可在线阅读,更多相关《jbpm5 持久化及流转流程剖析.docx(23页珍藏版)》请在三一办公上搜索。
1、Jbpm5 持久化及流转流程剖析1 Jbpm5 持久化结构图Jbpm5实例流程图下面的文档讲解了基于该流程的步骤流程2 第一步启动任务流程时序图:2.1 启动TaskServer使用线程启动TaskServer,初始化持久化OrganizationEntity,将流程中需要使用到的 groupId,actorId.全部初始化到表中。2.2 启动流程1)根据路径解析*.bpmn2或*.bpmn 文件,放入到内存中。 在该类注册了相关的对象org.jbpm.bpmn2.xml.BPMNSemanticModule .2.2.1 开启事务2.2.2 Ksession开始执行任务在org.drools
2、.persistence.SingleSessionCommandService 中 execute执行,流程实例为org.jbpm.ruleflow.instance.RuleFlowProcessInstance 的对象进入 mand.runtime.process.StartProcessCommand 中执行 excute2.2.3 执行StartNode执行StartNode,结点任务任务流转核心方法2.2.4 流程执行HumanTaskNode流程执行到HumanTask任务结点,引擎会执行org.jbpm.workflow.instance.node.WorkItemNodeIn
3、stance 这个实例类的internalTrigger方法,并持久化WorkItemInfo2.3 初始化Handler官方默认提供了WorkItemHandler的实现,com.carefx.workflow.handler.CommandBasedWSHumanTaskHandler。这个handler 就类似人工任务的范本,如果业务系统要做其他事情,可以适当的修改这个类就可以,例如:与外部组织机构交互等。2.3.1 初始化Client初始化TaskClient. 用于Client 与 服务端Server 交互2.3.2 建立Mina通信连接 Jbpm5 默认以 Mina 作为通信持久化
4、通信桥梁2.3.3 注册事件Complete2.3.4 注册事件Fail2.3.5 注册事件Skip初始化CommandBasedWSHumanTaskHandler方法时,由客户端发起,向服务端中注册任务事件(TaskCompletedEvent, TaskFailedEvent, TaskSkippedEvent, TaskClaimedEvent等)。客户端(通过mina发起):服务端(通过mina接收):2.4 调用excuteWorkItem 方法调用excuteWorkItem 方法,目的初始化任务信息(任务名称、任务优先级、处理任务人员分配等),将得到的任务信息 一并发送到服务端
5、进行持久化2.4.1 初始化Task任务信息2.4.2 调用Client添加任务信息2.4.3 AddTaskRequest由客户端(TaskClient) 向服务端(TaskServer)转发持久化 Task 请求该方法最后一行 通过发送 AddTaskRequest 请求,发送到服务端 ,由服务端持久化Task和 Content 信息2.4.4 持久化Task服务端(org.jbpm.task.service.TaskServerHandler)接收到客户端发送来的消息AddTaskRequest, 1)持久化Task信息,插入相关的表(PeopleAssignments_PotOwner
6、s,PeopleAssignments_ExclOwners,PeopleAssignments_Stakeholders,PeopleAssignments_Bas,PeopleAssignments_Recipients,Task, I18NTEXT)2.4.5 AddTaskResponse通过AddTaskResponse,由服务端(TaskServer) 发起请求通知客户端(TaskClient),通知客户端(org.jbpm.task.service.TaskClientHandler)添加任务完毕,持久化ProcessInstanceInfo, WorkItemInfo 数据此时
7、路程已经执行到了HumanTask任务结点上,同时分配了任务给具体的人。进行了持久化操作。接着等待人员触发该任务2.4.6 返回任务结束返回sessionId,procesInstanceId给用户,外部系统保持以便获取持久化信息。2.5 关闭事务(提交事务)持久化processInfo,workItem 等,并对 sessionInfo 解锁2.6 执行流程的后续操作2.6.1 执行HumanTaskAfterNode拦截器2.6.2 执行StartAfterNode拦截器2.6.3 执行HumanTaskAfterNode拦截器2.6.4 Ksession.disponse()释放kses
8、sion3 第二步人工任务流程时序图:3.1 启动TaskServerTaskServer 保持启动状态,或者重新启动一个线程亦可。3.2 调用人工任务执行接口外部系统通过该接口实现人工任务的交互3.3 解析bpmn2读取原来流程的bpmn2 文件并解析到jbpm5 框架中3.4 通过kessionId 获取ksession通过第一步返回的sessionId.获取到持久化的sessionInfo 信息,以及 processInstance信息。同时processInstance流程实体采用数据锁,保证并发安全性3.5 初始化Client3.5.1 建立Mina 通信连接初始化TaskClien
9、t, 建立起Mina连接 3.5.2 注册事件Complete3.5.3 注册事件Fail3.5.4 注册事件Skip同时由客户端(TaskClient)发起,须向服务端(TaskServer)中注册任务事件(TaskCompletedEvent, TaskFailedEvent, TaskSkippedEvent, TaskClaimedEvent)。注册几个事件,就需要发起几个Mina 请求客户端(通过mina发起):服务端(通过mina接收):3.5.5 返回3.6 registerWorkItemHandler(容器注册人工任务Handler)通过handler注册后,jbpm5 会自
10、动实现与业务系统的交互3.7 发起查询人工任务请求转发请求查询人工任务请求到 TaskClient3.7.1 QueryTasksAssignedAsPotentialOwner客户端(TaskClient)向服务端(TaskServer)发送请求。发起QueryTasksAssignedAsPotentialOwner 查询请求:查询分配的用户任务列表服务端(TaskServer) 接收QueryTasksAssignedAsPotentialOwner 请求3.7.2 QueryTaskSummaryResponse客户端(TaskClient)接收返回QueryTaskSummaryRe
11、sponse 请求自此,一个来回后,客户端总算获取到了任务信息,接下来再往下走吧3.7.3 返回人工任务信息人工任务返回 包含在 responseHandler 中 通过该接口的getResults 既可获取3.8 发起开始执行任务请求(Start)1. 查看是否需要分配任务,查看是否有groupId,如果groupId不为空则可以让该组下的某个用户先领取任务。(此处不介绍分配任务情况)2. 开始执行任务3.8.1 OperationRequest客户端(TaskClient)发起开始执行任务请求服务端(TaskServer)接收开始执行任务请求3.8.2 OperationResponse客
12、户端(TaskClient)接收请求自此,processInfo任务状态保存为InProcess.3.8.3 返回3.9 发起成功完成人工任务请求(Complete)完成任务,该流程极为繁琐。3.9.1 OpertationRequest客户端(TaskClient)向服务端(TaskServer)发送完成任务请求OperationRequest3.9.2 EventTriggerResponse由服务端(TaskServer)向服务端(TaskClient)发送EventTriggerResponse请求,目的需要客户端调用任务信息,促发getContentRequest,让Content做
13、持久化3.9.3 OperataionResponse服务端(TaskServer)向服务端(TaskClient)发送OperationResponse请求。3.9.4 GetTaskRequest客户端(TaskClient)向服务端(TaskServer)发送GetTaskRequest请求,查询用户任务信息。3.9.5 GetTaskResponse服务端(TaskServer)向服务端(TaskClient)发送GetTaskResponse请求,返回任务信息,并执行GetCompletedTaskResponseHandler 中的execute方法3.9.6 GetContent
14、Request客户端(TaskClient)向服务端(TaskServer)发送GetContentRequest请求,查询Content信息3.9.7 GetContentResponse服务端(TaskServer)向服务端(TaskClient)发送GetContentResponse请求,3.9.8 调用WorkItem管理器 completeWorkItem接口3.9.9 Ksession开启事务3.9.10 Kession 执行CompleteWorkItemCommand3.9.11 结点开始流转3.9.12 调用HumanHandler(初始化)初始化下个结点的 workIte
15、m 信息3.9.13 初始化client3.9.14 注册CompleteEvent3.9.15 注册FailEvent3.9.16 注册SkipEvent3.9.17 excuteWorkItem3.9.18 初始化下个结点的Task在CommandBasedWSHumanTaskHandler 中执行初始化下个结点的Task3.9.19 发送创建任务持久化请求3.9.20 AddTaskRequest3.9.21 AddTaskResponse3.9.22 返回3.9.23 返回3.9.24 提交事务3.9.25 返回4 相关表操作步骤TaskClientTaskServer操作类型涉及的
16、表2.1AOrganizationalEntity2.2.3ASessionInfo2.3.2AProcessInstanceInfo2.3.1AWorkItemInfo2.3.1AVariableInstanceLog, ProcessInstanceLog,NodeInstanceLog2.3.1AVariableInstanceLog,NodeInstanceLog2.4.4ATask,I18NText, PeopleAssignments_Bas,PeopleAssignments_PotOwners,PEOPLEASSIGNMENTS_EXCLOWNERS,PEOPLEASSIGNM
17、ENTS_RECIPIENTS,PEOPLEASSIGNMENTS_STAKEHOLDERS,Content,3.7UProcessInstanceInfo3.9.10AWorkItemInfo(新增下个结点)3.9.11AVariableInstanceLog, NodeInstanceLog3.9.17UProcessInstanceInfo(锁定)3.9.17DWorkItemInfo(删除原有结点)3.9.20ATask,I18NText, PeopleAssignments_Bas,PeopleAssignments_PotOwners,PEOPLEASSIGNMENTS_EXCLOWNERS,PEOPLEASSIGNMENTS_RECIPIENTS,PEOPLEASSIGNMENTS_STAKEHOLDERS,Content,3.924USessionInfo