3. Service服务
所有的Service都通过流程引擎获得。
3.1 RepositoryService
仓库服务是存储相关的服务,一般用来部署流程文件,获取流程文件(bpmn和图片),查询流程定义信息等操作,是引擎中的一个重要的服务。部署流程定义操作的数据库表有:部署表(act_re_deployment)、流程定义表(act_re_procdef)和二进制表(act_ge_bytearray)
//获取仓库服务
RepositoryService repositoryService= processEngine.getRepositoryService();
//部署流程
Deployment deployment =repositoryService.createDeployment()
.name("请假流程")
.addClasspathResource("leave.bpmn")
.deploy(); // 完成部署
ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery();
// 根据流程定义的key来过滤
query.processDefinitionKey("leave2");
// 添加排序条件
query.orderByProcessDefinitionVersion().desc();
//分页查询,从哪开始,查询几条
query.listPage(0, 2);
// 查询的是所有的流程定义
List<ProcessDefinition> list = query.list();
for (ProcessDefinition pd : list) {
System.out.println(pd.getId() + "-" + pd.getName() + "-" + pd.getVersion());
}
//根据id删除流程
repositoryService.deleteDeployment("1005");
部署文件实际是一个bpmn文件和一个png图片
部署bpmn的时候,系统自动生成了一个png图片,可以下载查看:
RepositoryService repositoryService = processEngine.getRepositoryService();
String deploymentId = "72501";//部署id
List<String> names = repositoryService.getDeploymentResourceNames(deploymentId);
for (String name : names) {
System.out.println(name);
// 获得两个流程定义文件对应的输入流
InputStream in = repositoryService.getResourceAsStream(deploymentId, name);
// 读取输入流写到指定的本地磁盘上
FileCopyUtils.copy(in, new FileOutputStream("F:/" + name));
in.close();
}
去F盘下可以看到两个文件:
自动生成的png图片中文会乱码,解决这个问题需要在processEngineConfiguration的bean中配置字体,如图:
<property name="activityFontName" value="宋体"/>
<property name="labelFontName" value="宋体"/>
如果不想生成png图片,可以配置如下属性:
<property name="createDiagramOnDeploy" value="false" />
还可以将png和bpnm添加到zip压缩包中,部署zip压缩包。
// 从类路径下读取leave.zip压缩文件,并把它包装成一个输入流
ZipInputStream zipInputStream = new ZipInputStream(this.getClass()
.getClassLoader().getResourceAsStream("leave.zip"));
Deployment deployment = repositoryService.createDeployment()
.addZipInputStream(zipInputStream)
.deploy(); // 完成部署
Activiti会把压缩包内的bpmn和png添加到数据库,即数据库里存的是解压后的两个文件而不是zip。
使用idea生成bpmn对应的png,需要把bpmn的文件后缀名改成xml
根据流程定义id获取文件流:
String processDefinitionId = "leave2:5:62504"; // 流程定义id
// 直接获得png图片的名称
// 根据流程定义id查询流程定义对象
ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery();
query.processDefinitionId(processDefinitionId);
ProcessDefinition processDefinition = query.singleResult();
// 根据流程定义对象获得png图片的名称,getResourceName()是获得bpmn
String pngName = processDefinition.getDiagramResourceName();
// 直接获得png图片对应的输入流
InputStream pngStream = repositoryService.getProcessDiagram(processDefinitionId);
// 读取输入流写到指定的本地磁盘上
FileCopyUtils.copy(pngStream, new FileOutputStream("F:/" + pngName));
pngStream.close();
3.2 RuntimeService
流程运行时的流程实例,流程定义,流程版本,流程节点等信息,使用运行时服务操作,是引擎中的一个重要的服务,启动流程实例操作的数据表有流程实例表(act_ru_execution)、任务表(act_ru_task)。
RuntimeService runtimeService = processEngine.getRuntimeService();
//key是act_re_procdef中的KEY_,即bpmn文件的id
runtimeService.startProcessInstanceByKey("leave2");
//或者根据流程定义id启动,id是act_re_procdef中的ID_,推荐使用
runtimeService.startProcessInstanceById("leave2:5:62504");
//一个KEY_对应多个ID_,即一个流程定义可以产生多个流程实例。
//查询流程,操作的是流程实例表(act_ru_execution)
ProcessInstanceQuery query = runtimeService.createProcessInstanceQuery();
List<ProcessInstance> list = query.list();
删除一个流程实例
String processInstanceId = "1001"; // 流程实例id
String deleteReason = "不请假了"; // 删除原因,任君写
runtimeService.deleteProcessInstance(processInstanceId, deleteReason);
3.3 TaskService
对任务进行查询、接收、办理、完成等操作。查询任务操作的数据表是任务表(act_ru_task)。
TaskService taskService = processEngine.getTaskService();
//创建查询对象,指定查询人,进行查询
List<Task> taskList =taskService.createTaskQuery().taskAssignee("ZhangSan").list();
//提交任务到下一个代理人
taskService.complete(task.getId());
listPage(offset,pageSize)用于分页查询
3.4 IdentityService
流程运行过程中的一些用户信息,组信息等操作使用认证服务,但是认证服务一般只作为辅助,每一个系统都有一个比较完整的人员系统,创建用户和用户组等操作。一般不使用自带的认证。
//添加用户组
IdentityService identityService = processEngine.getIdentityService();
Group groupEntity = identityService.newGroup("1001");
groupEntity.setName("超级管理员");
groupEntity.setType("administrator");
identityService.saveGroup(groupEntity);//保存用户组
//删除用户组
identityService.deleteGroup("1");
//添加用户
User user = identityService.newUser("10001");
user.setEmail("admin@sina.com");
user.setFirstName("zhang");
user.setLastName("san");
user.setPassword("admin");
identityService.saveUser(user);//保存用户
identityService.deleteUser("10001");//删除用户
3.5 HistoryService
流程运行时和运行完成之后的一些历史信息,包括历史任务,历史节点等
HistoryService historyService = processEngine.getHistoryService();
//查询历史运行信息
HistoricProcessInstance historicProcessInstance =
historyService
.createHistoricProcessInstanceQuery()
.processInstanceId("40001").singleResult();
System.out.println("开始时间:" + historicProcessInstance.getStartTime());
System.out.println("结束时间:" + historicProcessInstance.getEndTime());
3.6 FormService
可选服务,任务表单管理 后续讲解
3.7 ManagementService
Management Service 提供了对 Activiti 流程引擎的管理和维护功能,这些功能不在工作流驱动的应用程序中使用,主要用于
Activiti 系统的日常维护。
ManagementService managementService = processEngine.getManagementService();
String taskTable = managementService.getTableName(Task.class);
System.out.println(taskTable);