Activiti入门教程七(玩转存储引擎API)

               


     在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


<span style="font-family:Comic Sans MS;font-size:18px;">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(); }}</span>


     在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文件后,就可以获得资源文件的描述信息

<span style="font-family:Comic Sans MS;font-size:18px;">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()); }}</span>



     RepositoryService操作

     上面说了很多,下面来看一下厉害人物,看看这个东东里面都有哪些操作


<span style="font-family:Comic Sans MS;font-size:18px;"><span style="font-family:Comic Sans MS;font-size:18px;">public interface RepositoryService {  //关于流程的操作API    DeploymentBuilder createDeployment();    void deleteDeployment(String deploymentId);    void deleteDeploymentCascade(String deploymentId);    void deleteDeployment(String deploymentId, boolean cascade);    List<String> 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);    }</span></span>


     上面基本上就是该类的全部操作,我把上面的方法大致划分了三类,下面来分别说一下

     流程定义权限的操作

     我们已经把流程定义好了,那么也得涉及到权限操作吧!如何给用户或者用户组来分别权限呢,用的就是上面的API,由于是多对多的关系,涉及到了第三张表act_ru_identitylink,把资源和用户ID捆绑到一块


<span style="font-family:Comic Sans MS;font-size:18px;"><span style="font-family:Comic Sans MS;font-size:18px;">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); }}</span></span>


     RepositoryService数据查询和删除

    在本篇博客开头,就已经介绍了将流程描述文件、流程资源保存到数据库中,接下来就是如何来管理这些资源。


 //根据部署ID和资源名称查询部署资源

  InputStream getResourceAsStream(String deploymentId, String resourceName);

//根据流程定义id,查询资源文件信息

 InputStream getProcessModel(String processDefinitionId);

//根据流程定义id查询,查询流程图信息

InputStream getProcessDiagram(String processDefinitionId);

//根据部署id查询所有资源的信息

 List<String> getDeploymentResourceNames(String deploymentId);


     

     下面就以其中一个方法,看一下例子


<span style="font-family:Comic Sans MS;font-size:18px;">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(); }}</span>



     DeploymentQuery查询对象

 关于部署的所有查询操作,都与该接口有关,上篇博客已经介绍过了,内容都是一样的,就不再多说了




           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

猜你喜欢

转载自blog.csdn.net/qq_43747119/article/details/87273530