1.工作框架目录中 database 目录 database目录里边又有 drop 、create、updata 三个目录 存放的全是sql语句 这些sql一共创建23张表(activiti 5.13,activiti 5.16 有24张表)activiti 框架底层使用mybatis操作数据库
2.创建activiti的23张表方式:
1.执行框架提供的sql文件建表
2.使用框架提供的自动建表方式
Activiti的后台是有数据库的支持,所有的表都以ACT_开头。 第二部分是表示表的用途的两个字母标识。 用途也和服务的API对应。
1)ACT_RE_*: 'RE'表示repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。
2)ACT_RU_*: 'RU'表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。
3)ACT_ID_*: 'ID'表示identity。 这些表包含身份信息,比如用户,组等等。
4)ACT_HI_*: 'HI'表示history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。
ACT_GE_*: 通用数据, 用于不同场景下。
ACT_RE_* 三张表 act_re_deployment(流程部署表) 、act_re_model(流程模型表)、act_re_procdef(流程定义表) 表中的数据插入后一般不会变
act_ru_* 中最重要的表 act_ru_execution、act_ru_task、act_ru_variable 表中的数据一般会动态改变
act_id_* 中最要的表 act_id_group 、act_id_info、act_id_membership、act_id_user
3流程部署(将流程定义的规则保存到数据库)
操作的表有(插入操作):
act_re_deployment(部署表)、
act_re_procdef(流程定义表)、act_ge_baytearray(二进制文件表)
多次部署不会覆盖前一次部署的数据(会新增加一条,id变化是增加100)
部署流程的方式:1.加载单个的流程定义文件 2.加载zip文件
代码示例:
DeploymentBuilder deploymentBuilder = processEngine
.getRepositoryService().createDeployment();
// 方式一:加载单个的流程定义文件
// deploymentBuilder.addClasspathResource("qjlc.bpmn");
// deploymentBuilder.addClasspathResource("qjlc.png");
// Deployment deployment = deploymentBuilder.deploy();
//ZipInputStream zipInputStream = new ZipInputStream(this.getClass()
//.getClassLoader().getResourceAsStream("process.zip"));
ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(new File("d:\\process.zip")));
// 方式二:加载zip文件
deploymentBuilder.addZipInputStream(zipInputStream );
deploymentBuilder.deploy();
问题:activiti框架是如何确定id的值呢?哪种主键生成策略呢?
答:activiti生成id的策略 和 所有的策略都不一样 ,他是通过查找表act_ge_property表的,该表中有一个字段叫 next.dbid,这个字段的值就是下一条记录的id值(这个id用于activiti所有的表,也就是说activiti的所有表的主键都是唯一的,activiti的每一个插入操作都会来查这张表,获得id值)
问题:为什么activiti的id值是按100递增的呢?为什么不是按1递增的?
答 : activiti的每一次插入操作都会查询
act_ge_property表 ,但是每一次操作会写入几张表是不知道的,所以递增值跨度大一点。
列如 :第一次部署会操作三张表(
act_re_deployment 、
act_re_procdef 、
act_ge_baytearray
),它们的id分别是101,102,103。而第二次部署三张表的id分别是 201,202,203。
4.查询流程定义 :查询的表就是
act_re_procdef
代码示例:
ProcessDefinitionQuery query = processEngine.getRepositoryService().createProcessDefinitionQuery();
query.processDefinitionKey("qjlc");//根据key过滤
query.orderByProcessDefinitionVersion().asc();
List<ProcessDefinition> list = query.listPage(0, 10);
for (ProcessDefinition processDefinition : list) {
System.out.println(processDefinition.getId());
}
5.根据流程定义启动流程实例
流程实例:根据某个流程定义一次具体的执行过程就是一个流程实例。那么可知 流程定义和流程实例的关系为 一对多 (一个流程定义对应多个流程实例)
示例代码:
//方式一:根据流程定义id启动流程实例
//String processDefinitionId = "";//流程定义id
//processEngine.getRuntimeService().startProcessInstanceById(processDefinitionId);
String processDefinitionKey = "qjlc";
//方式二:根据流程定义key启动流程实例
ProcessInstance processInstance = processEngine.getRuntimeService().startProcessInstanceByKey(processDefinitionKey);
System.out.println(processInstance.getId() + " " + processInstance.getProcessDefinitionId());
操作的表有(都是insert):act_ru_execution(流程实例表)、act_ru_task(任务表)
6.查询个人任务,操作的数据表:act_ru_task(任务表)
示例代码:
TaskQuery query = processEngine.getTaskService().createTaskQuery();
query.taskAssignee("张三");
query.orderByTaskCreateTime().desc();
List<Task> list = query.list();
for (Task task : list) {
System.out.println(task.getId());
}
7.办理个人任务
示例代码:
String taskId = "1304";
processEngine.getTaskService().complete(taskId);
操作的数据表:
act_ru_execution,操作是update 更新字段act_id(存放流程节点的id)
act_ru_task,操作是先delete 然后 insert
8.删除流程定义,操作的表:
act_re_deployment(部署表)、
act_re_procdef(流程定义表)、act_ge_baytearray(二进制文件表)
如果被删除的流程已经被启动(流程正在走),那么该流程定义不可以删除。(因为你要删除的表被别的表引用了,外键约束),如果一定要删除的话,可以级联删除。
9.设置流程变量(流程变量以键值对存在,存放在表 act_ru_variable中,当流程实例结束时,对应的流程变量数据会被框架删除 )
设置流程变量的方式:
1.启动流程实例时设置:
示例代码:
/**
* 启动流程实例时设置流程变量
*/
@Test
public void test2() {
String processDefinitionKey = "bxlc";// 流程定义key
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("key1", "value1");
variables.put("loginUser", "小王");
ProcessInstance pi = processEngine.getRuntimeService()
.startProcessInstanceByKey(processDefinitionKey, variables);
System.out.println(pi.getId());
}
2.办理任务时设置:
示例代码:
/**
* 办理任务时设置流程变量
*/
@Test
public void test3() {
String taskId = "206";//任务id
Map<String, Object> variables = new HashMap<>();
variables.put("qjyy", "不想上班");
variables.put("qjts", 365);
processEngine.getTaskService().complete(taskId, variables);
}