1.Activiti的表说明
使用25张表:
ACT_GE_ (GE)
表示 general 全局通用数据及设置,各种情况都使用的数据。
ACT_HI_ (HI)
表示 history 历史数据表,包含着程执行的历史相关数据,如结束的流程实例,变量,任务,等等
ACT_ID_ (ID)
表示 identity 组织机构,用户记录,流程中使用到的用户和组。这些表包含标识的信息,如用户,用户组,等等。
ACT_RE_ (RE)
表示 repository 存储,包含的是静态信息,如,流程定义,流程的资源(图片,规则等)。
ACT_RU_ (RU)
表示 runtime 运行时,运行时的流程变量,用户任务,变量,职责(job)等运行时的数据。Activiti 只存储实例执行期间的运行时数据,当流程实例结束时,将删除这些记录。这就保证了这些运行时的表小且快。
25 张表详情
一般数据 (ACT_GE_)
ACT_GE_BYTEARRAY
二进制数据表,存储通用的流程定义和流程资源。
ACT_GE_PROPERTY
系统相关属性,属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录。
流程历史记录 (ACT_HI_)
ACT_HI_ACTINST
历史节点表
ACT_HI_ATTACHMENT
历史附件表
ACT_HI_COMMENT
历史意见表
ACT_HI_DETAIL
历史详情表,提供历史变量的查询
ACT_HI_IDENTITYLINK
历史流程人员表
ACT_HI_PROCINST
历史流程实例表
ACT_HI_TASKINST
历史任务实例表
ACT_HI_VARINST
历史变量表
用户用户组表 (ACT_ID_)
ACT_ID_GROUP
用户组信息表
ACT_ID_INFO
用户扩展信息表
ACT_ID_MEMBERSHIP
用户与用户组对应信息表
ACT_ID_USER
用户信息表
流程定义表 (ACT_RE_)
ACT_RE_DEPLOYMENT
部署信息表
ACT_RE_MODEL
流程设计模型部署表
ACT_RE_PROCDEF
流程定义数据表
运行实例表 (ACT_RU_)
ACT_RU_EVENT_SUBSCR
运行时事件 throwEvent、catchEvent 时间监听信息表
ACT_RU_EXECUTION
运行时流程执行实例
ACT_RU_IDENTITYLINK
运行时流程人员表,主要存储任务节点与参与者的相关信息
ACT_RU_JOB
运行时定时任务数据表
ACT_RU_TASK
运行时任务节点表
ACT_RU_VARIABLE
运行时流程变量数据表
其它
ACT_EVT_LOG
事件日志
ACT_PROCDEF_INFO
流程定义的动态变更信息
2.Activiti的架构,类关系图
获取流程引擎的工具类
- ProcessEngines.使用默认方式获取配置文件,构造流程引擎.配置文件名字activiti.cfg.xml,放在 classpath下
- ProcessEngineConfiguration 可以自定义配置文件名
使用上面2个工具类,都可以获得流程引擎
- ProcessEngine 流程引擎. 获取各种服务接口.
- 服务接口 用于流程的部署, 执行, 管理, 使用这些接口就是在操作对应的数据表
- RepositoryService 资源管理类
- RuntimeService 运行时管理类
- TaskService 任务管理类
- HistoryService 历史数据管理类
- ManagementService 流程引擎管理类
3.BPMN插件
idea安装actiBPM插件
4.流程符号, 画流程图
- 流程符号: 事件Event, 活动Activity, 网关 Gateway, 流向
- 使用流程设计器画出流程图
- bpmn文件本质上是xml文件,因为安装 actiBPM插件,才能可视化的看得到流程内容
- 创建bpmn文件, 在流程设计器使用流程符号来表达流程. 指定流程的Key, 指定任务负责人
- 生成PNG文件, 把bpmn文件后缀改为xml, 在这个文件邮件选择Diagrams->show BPMN2.0 Desinger,
打开窗口,点击导出文件按钮 - 选择导出文件类型为PNG. 要注意乱码问题
5.流程部署
使用Activiti提供的API把流程图的内容写入数据库中, 属于资源类操作, 使用RepositoryService
- 部署操作表:
act_re_deployment
部署表
act_re_procdef
流程定义表
act_ge_bytearray
资源表
单文件部署: 把bpmn文件和png文件一个一个处理
@Test
public void testDeployment() {
//1.创建ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.获取RepositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
//3.使用service进行流程的部署,定义一个流程的名字,把bpmn和png部署到数据中
Deployment deploy = repositoryService.createDeployment()
.name("businessTravelRequest")
.addClasspathResource("bpmn/evection.bpmn")
.addClasspathResource("bpmn/evection.png")
.deploy();
//4.输出部署信息
System.err.println("流程部署id=" + deploy.getId());
System.err.println("流程部署名字=" + deploy.getName());
}
压缩包部署: 把bpmn文件和png打zip压缩包来处理
Deployment deploy = repositoryService.createDeployment
@Test
public void deployProcessByZip() {
//获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取RepositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
//流程部署
//读取资源包文件 构造成inputStream
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("bpmn/evection.zip");
//用inputStream 构造ZipInputStream
ZipInputStream zipInputStream = new ZipInputStream(inputStream);
//使用压缩包的流进行流程的部署
Deployment deploy = repositoryService.createDeployment().addZipInputStream(zipInputStream).deploy();
System.err.println("流程部署的id= " + deploy.getId());
System.err.println("流程部署的名称= " + deploy.getName());
}
6.启动流程实例
使用RuntimeService根据流程定义的Key
- 操作表:
act_hi_actinst
流程实例执行历史信息
act_hi_identitylink
流程参与用户的历史信息
act_hi_procinst
流程实例的历史信息
act_hi_taskinst
流程任务的历史信息
act_ru_execution
流程执行信息
act_ru_identitylink
流程的正在参与用户信息
act_ru_task
流程当前任务信息
@Test
public void testStartProcess() {
//1.创建ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.获取RunTimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
//3.根据流程定义的id启动流程
ProcessInstance instance = runtimeService.startProcessInstanceByKey("myEvection");
//4.输出内容
System.err.println("流程定义ID:" + instance.getProcessDefinitionId());
System.err.println("流程实例ID:" + instance.getId());
System.err.println("当前活动的ID:" + instance.getActivityId());
}
7.查询个人待执行的任务
使用TaskService, 根据流程定义的Key, 任务的负责人来进行查询
@Test
public void testFindPersonalTaskList() {
//1.获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.获取taskService
TaskService taskService = processEngine.getTaskService();
//3.根据流程key和任务的负责人查询任务
List<Task> taskList = taskService.createTaskQuery().processDefinitionKey("myEvection").taskAssignee("zhangsan").list();
//4.输出(快捷键iter)
for (Task task : taskList) {
System.err.println("流程实例id=" + task.getProcessInstanceId());
System.err.println("任务Id=" + task.getId());
System.err.println("任务负责人=" + task.getAssignee());
System.err.println("任务名称=" + task.getName());
}
}
8.任务个人完成
使用TaskService, 用任务Id完成任务
@Test
public void completTask() {
//获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取service
TaskService taskService = processEngine.getTaskService();
//根据任务id完成任务
//taskService.complete("17505");
//获取jerry myEvection对应的任务
//Task task = taskService.createTaskQuery().processDefinitionKey("myEvection").taskAssignee("jerry").singleResult();
//完成jack的任务
//Task task = taskService.createTaskQuery().processDefinitionKey("myEvection").taskAssignee("jack").singleResult();
//完成Rose的任务
Task task = taskService.createTaskQuery().processDefinitionKey("myEvection").taskAssignee("rose").singleResult();
System.err.println("流程实例id=" + task.getProcessInstanceId());
System.err.println("任务Id=" + task.getId());
System.err.println("任务负责人=" + task.getAssignee());
System.err.println("任务名称=" + task.getName());
// 完成jerry的任务 、完成jack的任务、完成rose的任务
taskService.complete(task.getId());
}
9.查询流程定义
@Test
public void queryProcessDefinition() {
//获取引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取Repositoryservice
RepositoryService repositoryService = processEngine.getRepositoryService();
//获取ProcessDifinitionQuery对象
ProcessDefinitionQuery definitionQuery = repositoryService.createProcessDefinitionQuery();
//查询当前所有的流程定义,返回流程定义信息的集合
//processDefinitionKey(流程定义key)
//orderByProcessDefinitionVersion 进行排序
//desc 倒序
List<ProcessDefinition> definitionList = definitionQuery.processDefinitionKey("myEvection")
.orderByProcessDefinitionVersion()
.desc()
.list();
//输出信息
for (ProcessDefinition processDefinition : definitionList) {
System.err.println("流程定义ID: " + processDefinition.getId());
System.err.println("流程定义名称: " + processDefinition.getName());
System.err.println("流程定义Key: " + processDefinition.getKey());
System.err.println("流程定义版本: " + processDefinition.getVersion());
System.err.println("流程部署ID: " + processDefinition.getDeploymentId());
}
}
10.删除流程部署信息
当前的流程如果并没有完成,想要删除的话需要使用特殊的方式,原理就是级联删除
@Test
public void deleteDeployMent(){
//获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//通过引擎来获取 RepositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
//通过部署id来删除流程部署信息
String deploymentId = "60001";
//repositoryService.deleteDeployment(deploymentId);
repositoryService.deleteDeployment(deploymentId, true);
}
11.下载资源文件
方案1: 使用Activiti提供的api,来下载资源文件
方案2: 自己写代码从数据库中下载文件,使用jdbc对blob类型,clob类型数据读取出来
保存到文件目录 解决io操作:commons-io.jar
这里使用方案1
@Test
public void getDeployment() throws IOException {
// 1、得到引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2、获取api,RepositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
// 3、获取查询对象 ProcessDefinitionQuery查询流程定义信息
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.processDefinitionKey("myEvection")
.singleResult();
// 4、通过流程定义信息,获取部署ID
String deploymentId = processDefinition.getDeploymentId();
// 5、通过RepositoryService ,传递部署id参数,读取资源信息(png 和 bpmn)
// 5.1、获取png图片的流
// 从流程定义表中,获取png图片的目录和名字
String pngName = processDefinition.getDiagramResourceName();
// 通过 部署id和 文件名字来获取图片的资源
InputStream pngInput = repositoryService.getResourceAsStream(deploymentId, pngName);
// 5.2、获取bpmn的流
String bpmnName = processDefinition.getResourceName();
InputStream bpmnInput = repositoryService.getResourceAsStream(deploymentId, bpmnName);
// 6、构造OutputStream流
File pngFile = new File("d:/evectionflow01.png");
File bpmnFile = new File("d:/evectionflow01.bpmn");
FileOutputStream pngOutStream = new FileOutputStream(pngFile);
FileOutputStream bpmnOutStream = new FileOutputStream(bpmnFile);
// 7、输入流,输出流的转换
IOUtils.copy(pngInput,pngOutStream);
IOUtils.copy(bpmnInput,bpmnOutStream);
// 8、关闭流
pngOutStream.close();
bpmnOutStream.close();
pngInput.close();
bpmnInput.close();
}
12.查看历史信息
@Test
public void findHistoryInfo(){
// 获取引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取HistoryService
HistoryService historyService = processEngine.getHistoryService();
// 获取 actinst表的查询对象
HistoricActivityInstanceQuery instanceQuery = historyService.createHistoricActivityInstanceQuery();
// 查询 actinst表,条件:根据 InstanceId 查询
// instanceQuery.processInstanceId("17501");
// 查询 actinst表,条件:根据 DefinitionId 查询
instanceQuery.processDefinitionId("myEvection:1:15004");
// 增加排序操作,orderByHistoricActivityInstanceStartTime 根据开始时间排序 asc 升序
instanceQuery.orderByHistoricActivityInstanceStartTime().asc();
// 查询所有内容
List<HistoricActivityInstance> activityInstanceList = instanceQuery.list();
// 输出
for (HistoricActivityInstance hi : activityInstanceList) {
System.out.println(hi.getActivityId());
System.out.println(hi.getActivityName());
System.out.println(hi.getProcessDefinitionId());
System.out.println(hi.getProcessInstanceId());
}
}