Activiti(二)--流程存储

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名称排序

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值