那么既然无论是jbpm或者是activiti都需要ProcessEngine来驱动,那么我们就说一下工作流引擎的使用吧。
流程部署
当我们将我们的业务画成图的时候,然后利用工作流引擎部署,也就是将我们的流程图信息放到数据库,图和代码如下:
- /**部署流程定义*/
- @Test
- public void deploymentProcessDefinition(){
- Deployment deployment = processEngine.getRepositoryService() //用于流程定义和部署相关对象的Service
- .createDeployment() //创建一个部署对象
- .name("leaveBill部门程序")
- .addClasspathResource("diagrams/LeaveBill.bpmn") //从ClassPath资源中加载,一次只能加载一个文件
- .addClasspathResource("diagrams/LeaveBill.png") //从ClassPath资源中加载,一次只能加载一个文件
- .deploy();
- System.out.println("deployment" + deployment.getId()); //1
- System.out.println("deployment" + deployment.getName());//部门程序
- }
deployment1
deploymenthellworld部门程序
数据库(部署相关表)解析
我们看一下数据库的表会发现,每次部署都是涉及的那三张表,act_re_deployment(流程部署表)
该表包含了流程部署的名称,ID,和部署时间
act_re_procdef(流程定义表)
该表有流程定义的主键key,版本(version)源文件名和图示,还有流程定义ID(key + 版本号+随机生成的数字)
act_ge_bytearray(资源文件表)
保存了资源的位置和存储方式和部署ID,版本号ID等信息
act_ge_property:主键生成策略表
定义了主键生成的策略信息
执行流程
顾名思义,就是当我们有一个人开始申请请假的时候我们就要执行该请假的流程实例了
- /**
- * 执行流程实例
- */
- @Test
- public void startProcessInstance(){
- String processInstanceKey = "LeaveBill";
- ProcessInstance pi = processEngine.getRuntimeService()
- .startProcessInstanceByKey(processInstanceKey);
- System.out.println("流程实例id:" + pi.getId()); //流程实例id 101
- System.out.println("流程定义id:" + pi.getProcessDefinitionId()); //流程定义ID helloworld:1:4
- }
数据库分析(实例表)分析
act_ru_execution: 正在执行的执行对象表,侧重流程实例,对象,任务
包含了实例ID,流程定义ID,要执行的任务名称(usertask1)等信息
act_ru_task:正在执行的任务表,对具体的任务而言,任务执行到哪里了
act_ru_identitylink流程信息变量act_hi_taskinst:已经执行完的历史任务信息
act_hi_procinst:流程实例的历史表,存放执行完毕的流程实例信息
act_hi_actinst:存放历史所有完成的活动
现在我们对表有一个大致的了解,那么接下来我们就按照我们既定的流程去执行我们的请假,例如第一个项目经理叫张三,那么这个流程实例已启动,首先需要张三去执行操作,那么我们我们看一下张三的执行任务的详情,代码如下:
- /**
- * 查找个人当前的要执行的任务
- */
- @Test
- public void findMyTaskInfo(){
- String assignee = "张三";
- List<Task> listTask = processEngine.getTaskService()
- .createTaskQuery()
- .taskAssignee(assignee)
- .list();
- if (listTask!= null && listTask.size() >0) {
- for (Task task : listTask) {
- System.out.println("任务ID:" + task.getId());
- System.out.println("任务名称:" + task.getName());
- System.out.println("任务时间:" + task.getCreateTime());
- System.out.println("任务的班里人:" + task.getAssignee());
- System.out.println("任务的实例ID:" + task.getProcessDefinitionId());
- System.out.println("执行对象的ID:" + task.getExecutionId());
- System.out.println("任务的班里人:" + task.getAssignee());
- System.out.println("流程定义ID:" + task.getProcessInstanceId());
- }
- }
- }
任务完成
那么接下来我就把任务ID为304的一个流程结束,也就是项目经理同意请假,代码如下:
- /**完成任务*/
- @Test
- public void completeMyPersoinTask() {
- String taskId = "304";
- processEngine.getTaskService()
- .complete(taskId);
- System.out.println("完成任务,任务ID:" + taskId);
- }
如果我们启动了实例的话,查询当前信息的话,实在act_ru_*的表中查询,根据任务有关的服务,都是taskService,当然Activiti还有很多的服务,例如RepositoryService,RuntimeService, HistoryService等服务。
大致总结一下,就是先部署,再启动,个人登陆系统后,根据个人姓名,查到任务ID,完成个人任务,直到全部完成
本文详细介绍了如何使用Activiti工作流引擎进行流程部署和执行。通过代码示例展示了如何部署流程定义,解析相关数据库表,启动流程实例,并查找及完成个人任务。涉及到的关键操作包括部署流程、查看数据库中的流程信息、执行流程实例以及任务管理。
1021

被折叠的 条评论
为什么被折叠?



