在Activiti中有很多的组件,说组件就有点高大上了,其实Activiti在设计上,为了把数据库划分,所以才分为这么多类。比如后天有存储用户的,那么我就设计一个用户组件,用来管理用户的增删改查。相应的还有身份组件、存储引擎组件等等,那么本篇博客就来玩一下repositoryService流程存储组件的API
DeploymentBuilder操作
在开发中,会涉及到各种的流程操作,所以必须要把这些流程操作,以图片或者以Activiti自己的格式.bpmn的形似存储起来吧!这就是所谓的流程文件部署。看一下Activiti为我们提供了一个方便添加的接口DeploymentBuilder。
public interface DeploymentBuilder {
//以输入流的形式保存到数据库中
DeploymentBuilder addInputStream(String resourceName, InputStream inputStream);
//以路径的形式,保存classpath下面的资源
DeploymentBuilder addClasspathResource(String resource);
//添加字符串资源,text为资源的内容
DeploymentBuilder addString(String resourceName, String text);
//添加压缩包的资源,最终会把压缩包中的全部内容全部添加其中
DeploymentBuilder addZipInputStream(ZipInputStream zipInputStream);
//修改部署资源文件的名称
DeploymentBuilder name(String name);
//添加资源文件的类型
DeploymentBuilder category(String category);
//过滤重复部署,如果部署的资源内容和资源名称一致的话,就不会再部署
DeploymentBuilder enableDuplicateFiltering();
//改变资源的激活状态,默认为激活状态
DeploymentBuilder activateProcessDefinitionsOn(Date date);
//最后资源部署
Deployment deploy();
}
上面就是有关部署资源的一些方法,百闻不如一见,多多实践一下,下面小编准备了所有的方法demo
public class AddInputStream { public static void main(String[] args) throws Exception { // 创建流程引擎 ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); // 得到流程存储服务实例 RepositoryService repositoryService = engine.getRepositoryService(); // 第一个资源输入流 InputStream is1 = new FileInputStream(new File( "resource/artifact/flow_inputstream1.png")); // 第二个资源输入流 InputStream is2 = new FileInputStream(new File( "resource/artifact/flow_inputstream1.png")); // 创建DeploymentBuilder实例 DeploymentBuilder builder = repositoryService.createDeployment(); // 为DeploymentBuilder添加资源输入流 builder.addInputStream("inputA", is1); builder.addInputStream("inputB", is2); builder.addClasspathResource("artifact/classpath.png"); // 添加String资源 builder.addString("test", "this is string method"); builder.name("hello"); // 获取zip文件的输入流 FileInputStream fis = new FileInputStream(new File( "resource/artifact/ZipInputStream.zip")); // 读取zip文件,创建ZipInputStream对象 ZipInputStream zi = new ZipInputStream(fis); // 添加Zip压缩包资源 builder.addZipInputStream(zi); // 执行部署方法 builder.deploy(); } }
在DeploymentBuilder中,我们看到了一个激活状态的设置,那么如何终止或者激活流程呢?repositoryService为我们提供了方法,如下
//根据流程定义ID终止流程
void suspendProcessDefinitionById(String processDefinitionId);
//根据流程KEY来终止流程
void suspendProcessDefinitionByKey(String processDefinitionKey);
//根据流程定义ID来激活流程
void activateProcessDefinitionById(String processDefinitionId);
//根据流程定义key来激活流程
void activateProcessDefinitionByKey(String processDefinitionKey);
ProcessDefinition操作
在Activit中,在添加资源的时候,首先对资源文件进行解析,如果后缀是.xml或者.bpmn的文件,均会被看作是描述文件,因此在部署的时候,不仅仅保存资源文件,还会向数据库中添加资源文件的描述信息。ProcessDefinition该接口就是资源文件信息描述实体。
public interface ProcessDefinition {
String getId();
String getCategory();
String getName();
String getKey();
String getDescription();
int getVersion();
String getResourceName();
String getDeploymentId();
String getDiagramResourceName();
boolean hasStartFormKey();
boolean isSuspended();
}
如下面的例子,部署.bpmn文件后,就可以获得资源文件的描述信息
public class DeployDiagram { public static void main(String[] args) { // 创建流程引擎 ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); // 得到流程存储服务实例 RepositoryService repositoryService = engine.getRepositoryService(); //部署流程描述文件与流程图 Deployment dep = repositoryService.createDeployment() .addClasspathResource("bpmn/diagram.bpmn") .addClasspathResource("bpmn/diagram.png") .addClasspathResource("bpmn/diagram.vacationProcess.png") .deploy(); //查询流程定义实体 ProcessDefinition def = repositoryService.createProcessDefinitionQuery() .deploymentId(dep.getId()).singleResult(); // 输出结果为 bpmn/diagram.vacationProcess.png System.out.println(def.getDiagramResourceName()); } }
RepositoryService操作
上面说了很多,下面来看一下厉害人物,看看这个东东里面都有哪些操作
public interface RepositoryService {
//关于流程的操作API
DeploymentBuilder createDeployment();
void deleteDeployment(String deploymentId);
void deleteDeploymentCascade(String deploymentId);
void deleteDeployment(String deploymentId, boolean cascade);
List getDeploymentResourceNames(String deploymentId);
InputStream getResourceAsStream(String deploymentId, String resourceName);
ProcessDefinitionQuery createProcessDefinitionQuery();
NativeProcessDefinitionQuery createNativeProcessDefinitionQuery();
DeploymentQuery createDeploymentQuery();
NativeDeploymentQuery createNativeDeploymentQuery();
//激活终止流程的API操作
void suspendProcessDefinitionById(String processDefinitionId);
void suspendProcessDefinitionById(String processDefinitionId, boolean suspendProcessInstances, Date suspensionDate);
void suspendProcessDefinitionByKey(String processDefinitionKey);
void suspendProcessDefinitionByKey(String processDefinitionKey, boolean suspendProcessInstances, Date suspensionDate);
void activateProcessDefinitionById(String processDefinitionId);
void activateProcessDefinitionById(String processDefinitionId, boolean activateProcessInstances, Date activationDate);
void activateProcessDefinitionByKey(String processDefinitionKey);
void activateProcessDefinitionByKey(String processDefinitionKey, boolean activateProcessInstances, Date activationDate);
void setProcessDefinitionCategory(String processDefinitionId, String category);
//查询流程资源的操作
InputStream getProcessModel(String processDefinitionId);
InputStream getProcessDiagram(String processDefinitionId);
ProcessDefinition getProcessDefinition(String processDefinitionId);
BpmnModel getBpmnModel(String processDefinitionId);
DiagramLayout getProcessDiagramLayout(String processDefinitionId);
//流程定义权限的操作
void addCandidateStarterUser(String processDefinitionId, String userId);
void addCandidateStarterGroup(String processDefinitionId, String groupId);
void deleteCandidateStarterUser(String processDefinitionId, String userId);
void deleteCandidateStarterGroup(String processDefinitionId, String groupId);
}
上面基本上就是该类的全部操作,我把上面的方法大致划分了三类,下面来分别说一下
流程定义权限的操作
我们已经把流程定义好了,那么也得涉及到权限操作吧!如何给用户或者用户组来分别权限呢,用的就是上面的API,由于是多对多的关系,涉及到了第三张表act_ru_identitylink,把资源和用户ID捆绑到一块
public class UserCandidate {
public static void main(String[] args) {
// 创建流程引擎
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 得到流程存储服务实例
RepositoryService repositoryService = engine.getRepositoryService();
// 得到身份服务组件
IdentityService identityService = engine.getIdentityService();
//部署流程描述文件
Deployment dep = repositoryService.createDeployment()
.addClasspathResource("bpmn/candidateUser.bpmn").deploy();
//查询流程定义实体
ProcessDefinition def = repositoryService.createProcessDefinitionQuery()
.deploymentId(dep.getId()).singleResult();
// 写入用户数据
creatUser(identityService, "user1", "angus", "young", "[email protected]", "123");
creatUser(identityService, "user2", "angus2", "young2", "[email protected]", "123");
creatUser(identityService, "user3", "angus3", "young3", "[email protected]", "123");
// 设置用户组与流程定义的关系(设置权限)
repositoryService.addCandidateStarterUser(def.getId(), "user1");
repositoryService.addCandidateStarterUser(def.getId(), "user2");
}
//创建用户方法
static void creatUser(IdentityService identityService, String id, String first, String last, String email, String passwd) {
// 使用newUser方法创建User实例
User user = identityService.newUser(id);
// 设置用户的各个属性
user.setFirstName(first);
user.setLastName(last);
user.setEmail(email);
user.setPassword(passwd);
// 使用saveUser方法保存用户
identityService.saveUser(user);
}
}
在本篇博客开头,就已经介绍了将流程描述文件、流程资源保存到数据库中,接下来就是如何来管理这些资源。
//根据部署ID和资源名称查询部署资源
InputStream getResourceAsStream(String deploymentId, String resourceName);
//根据流程定义id,查询资源文件信息
InputStream getProcessModel(String processDefinitionId);
//根据流程定义id查询,查询流程图信息
InputStream getProcessDiagram(String processDefinitionId);
//根据部署id查询所有资源的信息
List
getDeploymentResourceNames(String deploymentId);
下面就以其中一个方法,看一下例子
public class GetProcessDiagram {
public static void main(String[] args) throws Exception {
// 创建流程引擎
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 得到流程存储服务对象
RepositoryService repositoryService = engine.getRepositoryService();
// 部署一份流程文件与相应的流程图文件
Deployment dep = repositoryService.createDeployment()
.addClasspathResource("bpmn/getProcessDiagram.bpmn")
.addClasspathResource("bpmn/getProcessDiagram.png").deploy();
// 查询流程定义
ProcessDefinition def = repositoryService.createProcessDefinitionQuery()
.deploymentId(dep.getId()).singleResult();
// 查询资源文件
InputStream is = repositoryService.getProcessDiagram(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();
}
}
DeploymentQuery查询对象
关于部署的所有查询操作,都与该接口有关,上篇博客已经介绍过了,内容都是一样的,就不再多说了