Activiti流程存储
- 1 流程文件部署
- 1.1 Deployment对象
- 1.2 DeploymentBuilder对象
- 1.3 修改部署信息
- 1.4 过滤重复部署
- 1.5 取消部署时的验证
- 2 流程定义的管理
- 2.1 ProcessDeinition对象
- 2.2 流程部署
- 2.3 中止与激活流程
- 3 流程定义权限
- 3.1 设置流程定义的用户权限和用户组权限
- 3.2 IdentityLink对象
- 3.3 查询权限数据
- 4 RepositoryService数据查询与删除
- 4.1 查询部署资源
- 4.2 查询流程文件
- 4.3 查询流程图
- 4.4 查询部署资源名称
- 4.5 删除部署资源
- 4.6 DeploymentQuery对象
1 流程文件部署
1.1 Deployment对象
Deployment对象是一个接口,一个Deployment实例表示一条ACT_RE_DEPLOYMENT表的数据,子接口为DeploymentEntity,实现类为DeploymentEntityImpl,其包含以下字段
id:主键
name:部署名称
DeploymentTime: 部署时间
category:部署的类别,
tenantId:在云时代,同一个软件可能被多个用户使用,该字段为租户id
Key:为部署设置键属性
1.2 DeploymentBuilder对象
对流程文件进行部署,需要使用DeploymentBuilder对象,获取方法如下:
//得到流程存储服务实例
RepositoryService repositoryService = engine.getRepositoryService();
//创建DeploymentBuilder实例
DeploymentBuilder builder = repositoryService.createDeployment();
DeploymentBuilder有如下方法:
addClasspathResource(String resource);//添加classpath下的资源文件
addInputStream(String resourceName,InputStream inputStream);//添加输入流资源
addString(String resourceName,String text);//添加字符串资源
addZipInputStream(ZipINputStream inputStream);//添加zip压缩包资源
addBpmnModel(String resourceName,BpmnModel bomnModel);//解析BPMN模型对象
addBytes(String resource Name,byte[] bytes);//添加字节资源
1.3 修改部署信息
//创建流程引擎
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
//得到流程存储服务对象
RepositoryService repositoryService = engine.getRepositoryService();
//创建DeploymentBuiler实例
DeploymentBuilder builder = repositoryService.createDeployment();
//设置各个属性
builder.name("crazyit").tenantId("tenantId").key("myKey").category("myCategory");
//执行部署
builder.deploy();
1.4 过滤重复部署
//创建DeploymentBuiler实例
DeploymentBuilder builderA = repositoryService.createDeployment();
builderA.addClasspathResource("artifact/DuplicateFilter.txt");
builderA.name("DuplicateFilterA”) ;
builderA.deploy();
//由于资源一样,并且调用了enableDuplicateFiltering方法,因此不会再写入数据库中
DeploymentBuilder builderB = repositoryService.createDeployment();
builderB.addClasspathResource("artifact/DuplicateFilter.txt");
builderB.name("DuplicateFilterA");
builderB.enableDuplicateFiltering();
builderB.deploy();
1.5 取消部署时的验证
默认情况下,在部署流程文件时会流程的xml文件进行校验,包括验证是否否和BPMN2.0的规范.定义的流程是否可执行.如果xml文件不符合规范或者不可执行,那么部署时将会抛出异常.
//取消了验证,xmlError.bpmn存在问题时也不会报错
DeploymentBuilder builderA = repositoryService.createDeployment();
builderA.addClasspathResource("bpmn/xmlError.bpmn")
.disableSchemaValidation().deploy();
2 流程定义的管理
2.1 ProcessDeinition对象
ProcessDeinition对象是一个接口,一个ProcessDefinition实例表示一条流程定义数据,在Activiti中,它的实现类为ProcessDefinitionEntityImpl,对应的数据表为ACT_RE_PROCDEF. ProcessDefinition有如下方法:
getCategory:返回流程定义的category属性,对应category_字段的值
getDeploymentId:返回部署的id
getDescription:返回流程定义的描述
getDiagramResouceName:如果流程定义有流程图的话,将返回流程图对应的资源名称
getEngineVersion:返回流程殷勤版本
getId:返回流程定义主键
getKey:返回流程定义的名称,此名称唯一
getName:返回流程定义显示的名称
getResouceName:在部署时,会将流程定义的XML文件存到资源表中,该方法返回资源的名称
getTenantId:返回租户id
getVersion:返回流程定义的版本号,对应VERSION_字段
hasGraphicalNotation:该流程定义文件是否有流程图的xml元素
hasStartFromKey:流程的开始事件中是否存在activiti:fromKey的定义
isSuspened:是否为中断状态,1表示激活状态,2表示中断状态
2.2 流程部署
部署流程
DeploymentBuilder builderA = repositoryService.createDeployment();
builderA.addClasspathResource("bpmn/xmlError.bpmn").deploy();
部署流程和流程图
//如果部署时不提供流程图,但在流程定义的xml文件中保存了BPMN流程图的元素,则Activiti会自动生成流程图
Deployment dep = repositoryService.createDeployment()
.addClasspathResource("bpmn/diagram.bpmn")
.addClasspathResource("bpmn/diagram.png")
.deploy();
//查询流程定义实体
ProcessDefinition def = repositoryService.createProcessDefinitionQuery()
.deploymentId(dep.getId()).singleResult();
System.out.println(def.getDiagramResourceName());
2.3 中止与激活流程
activateProcessDefinitionById(String processDefinitionId);//根据流程定义的id激活流程定义
activateProcessDefinitionById(String processDefinitionId,boolean activateProcessInstances,Date activationDate);//在某个时间激活流程定义,如果activateProcessInstances为true,则该流程顶一下的流程实例,也会被激活.
suspend’ProcessDefinitionById(String processDefinitionId);//根据流程ID中止流程定义21
suspendProcessDefinitionByKey(String processDefinitionKey);//根据流程定义文件中的process节点的id属性中止流程定义,也可以看作根据ACT_RE_PROCDEF表中的KEY_字段值中止流程定义
activateProcessDefinitionByKey(String processDefinitionKey);//根据流程的key激活流程
3 流程定义权限
3.1 设置流程定义的用户权限和用户组权限
Deployment dep = repositoryService.createDeployment()
.addClasspathResource("bpmn/diagram.bpmn")
.deploy();
//查询流程定义实体
ProcessDefinition def = repositoryService.createProcessDefinitionQuery()
.deploymentId(dep.getId()).singleResult();
//设置用户组与流程定义的关系,user1,user2为用户id,group1为用户组id
repositoryService.addCanditateStarterUser(def.getId(),"user1");
repositoryService.addCanditateStarterUser(def.getId(),"user2");
//设置流程定义的用户组权限
repositoryService.addCanditateStarterGroup(def.getId(),"group1");
3.2 IdentityLink对象
一个IdentityLink实例表示一种身份数据与数据绑定的关系,此处所说的身份数据包括用户组和用户数据,流程数据包括流程定义,流程任务等数据.IdentityLink是一个接口,对应实现类为IdentityLinkImpl,对应的数据表为ACT_RU_IDENTITYLINK,包含以下属性:
id:主键,对应ID_字段
type:数据类型,对应TYPE_字段,Activiti为该字段提供了5个值,分别为assignee,candidate,starter,participant和owner
groupId:绑定关系中的用户组Id,对应GROUP_ID_字段
userId:绑定关系中的用户id,对应user_id字段
taskId:绑定关系中的流程任务id,对应task_id字段
processDefId:绑定关系中的流程任务id,对应proc_def_id字段
3.3 查询权限数据
Deployment dep = repositoryService.createDeployment()
.addClasspathResource("bpmn/diagram.bpmn")
.deploy();
//根据用户查询有权限的流程定义
List<ProcessDefinition> defs = repositoryService.createProcessDefinitionQuery().startableByUser("user1").list();
System.out.println("用户张三有权限的流程定义为:"+JsonObject.toJsonString(defs));
//根据流程定义查询用户组数据
List<Group> groups = identityService.createGroupQuery().potentialStarter(def.getId()).list();
//根据流程定义查询用户数据
List<User> users = identityService.createUserQuery().potentialStarter(def.getId()).list();
//根据流程定义查询全部的IdentityLink(ACT_RU_IDENTITYLINK表)
List<IdentityLink> links = repositoryService.getIdentityLinksForProcessDefinition(def.getId());
4 RepositoryService数据查询与删除
4.1 查询部署资源
//创建流程引擎
ProcessEngine engine = ProcessEngine.getDefaultProcessEngine();
//得到流程存储服务对象
RepositoryService repositoryService = engine.getRepositoryService();
//部署一份txt文件
Deployment dep = repositoryService.createDeployment().addClassPathResource("artifact/GetResource.txt").deploy();
//查询资源文件
Inputstream in = repositoryService.getResourceAsStream(dep.getId(),"artifact/GetResource.txt");
//读取输入流
int count = is.available();
byte[] contents = new byte[count];
is.read(contents);
String result = new String(contents);
//输出结果
System.out.plintln(result);
4.2 查询流程文件
//部署一份流程文件
Deployment dep = repositoryService.createDeployment().addClassPathResource("bpmn/getProcessModel.bpmn").deploy();
//查询流程定义实体
ProcessDefinition def = repositoryService.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
//查询流程文件
InputStream is = repositorySrevice.getProcessModel(def.getId());
//读取输入流
int count = is.available();
byte[] contents = new byte[count];
is.read(contents);
String result = new String(contents);
//输出结果
System.out.plintln(result);
4.3 查询流程图
//部署一份流程文件
Deployment dep = repositoryService.createDeployment().addClassPathResource("bpmn/getProcessModel.bpmn").deploy();
//查询流程定义实体
ProcessDefinition def = repositoryService.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
//查询资源文件
InputStream is = repositoryService.getProcesDiagram(def.getId());
//将输入流转换成图片对象
BufferedImage image = ImageIO.read(is);
//保存为图片文件
File file = new File("resource/artifact/result.png");
if(!file.exists()){
file.createNewFile();
}
FileOutputStream fos = new FileOutputStream(file);
ImageIO.write(image,"png",fos);
fos.close();
is.close();
4.4 查询部署资源名称
Deloyment dep = repositoryService.createDeployment()
.addClassPathResource("bpmn/GetResourceName.bpmn")
.addClassPathResource("bpmn/GetResourceName.png").deploy();
//查询资源文件名称集合
List<String> names = repositoryService.getDeploymentResouceNames(dep.getId());
for(String name : names){
System.out.plantln(name);//结果为 bpmn/GetResourceName.bpmn bpmn/GetResourceName.png
}
4.5 删除部署资源
repositoryService.deleteDeployment(String deploymentId);//删除部署数据,不进行级联删除,这里所说的级联删除,是指与该部署相关的流程实例数据的删除
repositoryService.deleteDeployment(String deploymentId,boolean cascade);//是否进行级联删除,cascade为ture则会删除部署相关的流程实例数据,false则不会.
4.6 DeploymentQuery对象
deploymentId(String id);//查询id为参数值的数据记录
deploymentName(String name);//添加名称查询条件,查询Deployment名称为参数值的数据记录
deploymentNameLike(String name);//添加模糊查询条件
orderByDeploymentId:设置查询结果按照Deployment的ID进行排序,排序方式有asc和desc方法决定
orderByDeploymentTime:设置查询结果按照DEPLOY_TIME排序
orderByDeploymentName:设置查询结果按照Deployment名称排序