关于Activity工作流的认知和理解
Activity的介绍
首先,个人理解activity就是个组件。帮祝我们完成工作流程等一系列跟流程相
关的组件。
其次呢,activity工作引擎。比如我们公司是利用其思想和自带的方法实现了功
能。也就是说activity在创建的时候会生成23张表,正常情况来说,这23张表已经可
以帮助你完成很多事情了。但是大多数人还是会自己创建一套库表来完成自己的业务
吧。现在来说一下这几天记录到的小知识点
Activity的库
select * FROM act_re_procdef -- 流程定义表
select * FROM act_re_deployment -- 部署表
SELECT * FROM act_ge_property -- 通用属性表 id生成策略 next.dbid 影响的是部署表的id
select * FROM act_ru_execution -- 执行对象,流程实例,流程对象
select * FROM act_ru_task -- 任务表
select * FROM act_ge_bytearray -- 通用字节资源表
Activity的几种实现方式
第一种 代码实现
通过代码的方式实现,如图:
第二种 配置文件
通过配置文件的方式实现,实现原理其实是一样的。如图:
第三种 接口实现
其实很简单,如图:
Activity运行的几个步骤
取流程引擎
这一步的操作会去的流程引擎,配置好数据库连接,
他自然会去创建数据库的表格(23张表)。
@Test
public void createProcessEnginer() {
//这是通过代码的方式创建流程引擎
//取得ProcessEngineConfiguration对象
ProcessEngineConfiguration engineConfiguration=ProcessEngineConfiguration.
createStandaloneProcessEngineConfiguration();
//设置数据库连接属性
engineConfiguration.setJdbcDriver("com.mysql.jdbc.Driver");
engineConfiguration.setJdbcUrl("jdbc:mysql://localhost:3306/activitidb?createDatabaseIfNotExist=true"
+"&useUnicode=true&characterEncoding=utf8");
engineConfiguration.setJdbcUsername("root");
engineConfiguration.setJdbcPassword("root");
// 设置创建表的策略;没有表的时候自动创建
// public static final java.lang.String DB_SCHEMA_UPDATE_FALSE = "false";不会自动创建表 没有表 则抛异常
// public static final java.lang.String DB_SCHEMA_UPDATE_CREATE_DROP = "create-drop";先删除,再创建表
// public static final java.lang.String DB_SCHEMA_UPDATE_TRUE = "true";假如没有表。自动创建
engineConfiguration.setDatabaseSchemaUpdate("true");
//通过ProcessEngineConfiguration对象创建ProcessEngine对象
ProcessEngine p=engineConfiguration.buildProcessEngine();
System.out.println("流程引擎创建成功");
// //通过配置文件的方式获取引擎
// ProcessEngineConfiguration engineConfiguration=ProcessEngineConfiguration.
// createProcessEngineConfigurationFromResource("activiti.cfg.xml");//从类加载的路径查找资源
// ProcessEngine processEngine=engineConfiguration.buildProcessEngine();
// System.out.println("创建流程引擎");
}
部署流程定义
这一步操作简单来说就是部署流程,例如一些流程名字或者类别啥的
可以在这一步进行部署,这些信息会加载到相应的流程定义表里。
@Test
public void deploy() {
//取的流程引擎对象
//ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();
//获取仓库服务:管理流程定义
RepositoryService repositoryService=processEngine.getRepositoryService();
//创建一个部署的构建器
Deployment deploy=repositoryService.createDeployment()
.addClasspathResource("diagrams/MyProcess.bpmn")//在类路径中添加资源,一次只能添加一个资源
.addClasspathResource("diagrams/MyProcess.png")//两个资源加载完毕
.name("请假单流程")//设置部署名称
.category("办公类别")//设置部署的类别
.deploy();
System.out.println("部署的id"+deploy.getId());
System.out.println("部署的名字"+deploy.getName());
}
执行任务
这一步主要是开始执行任务了,这里模拟了一下任务的执行操作
各个审批人之间的联系
//执行流程
@Test
public void startProcess() {
//获取流程定义表中的key 项目中可以进行实施查询
String processKey="myProcess";
//取运行时的服务
RuntimeService runtimeService=processEngine.getRuntimeService();
ProcessInstance pi= runtimeService.startProcessInstanceByKey(processKey);//通过流程定义的key执行流程
System.out.println("流程实例的id="+pi.getId());
System.out.println("流程定义的id="+pi.getProcessDefinitionId());
//此时第一流程已经开启,可以在执行对象表查询到信息
}
查询流程
这个方法主要是查询流程用的方法,利用此方法查询出流程执行到哪一步了。当前执行人的名字和id等一些信息
//查询任务
@Test
public void queryTask() {
//任务办理人 由于是刚开始执行任务所以任务的办理人是张三
String name ="张三";
TaskService taskService=processEngine.getTaskService();
TaskQuery taskQuery=taskService.createTaskQuery();//创建了一个查询对象
List<Task> taList=taskQuery.taskAssignee(name).list();//办理人的任务列表
//遍历任务列表看一看
for(Task task: taList) {
System.out.println("任务办理人="+task.getAssignee());
System.out.println("任务id="+task.getId());
System.out.println("任务的名字="+task.getName());
}
}
完成任务
这个操作会让流程结束,在实际应用中到最后一级审批人就可以让流程执行完成操作
//完成任务 让任务结束的操作
@Test
public void compileTask() {
String taskId="204";
//接的是一个任务的id
processEngine.getTaskService().complete(taskId);//参数是一个任务的id
System.out.println("任务执行完毕");
}