• activiti学习第二天


    今天我们来发布一个流程,然后查看数据库中都发生了什么变化。

    下面我们使用activiti designer设计一个流程。如图

    流程很简单,我们先简单后增加难度。

    创建流程图的顺序,新建一个文件夹(diagram)右键新建一个activiti diagram如图:

    至于这个流程图怎么画,就不在这里详细的讲述了,如果你顺利的把activiti designer安装上,这个流程并不难画出来。其实这个流程图就是一个xml文件,遵循了bpmn协议。我们可以使用xml编辑器将他打开,查看里面的内容(这里我只截取了一段xml内容):

    在生成这个xml的同时,activiti插件还可以给我们生成对应的bmp图片。做如下图设置

    这时候我们的流程图必须发生变化并保存,才会生成这个图片。

    我之前在流程图上面点击右键,也可以到处bmp图片,但当发布的时候就会报错。查看错误原因是因为图片过大,activiti应该是要将这个图片的字节数组保存到数据库中去,如果自己手动导出这个图片,会导致图片达到1M左右,插入数据的时候就会报错,而activiti插件生成的图片会很小,没有这个问题。

    下面我们开始部署这两个资源文件。

     1 @Test
     2     public void deployProcess() throws SQLException, ClassNotFoundException{
     3         String resource="activiti.cfg.xml";
     4         ProcessEngineConfiguration configuration=ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(resource);
     5         ProcessEngine engine=configuration.buildProcessEngine();
     6         RepositoryService repositoryService= engine.getRepositoryService();
     7         String resourceName_bpmn="leave_bpmn";
     8         String resourceName_bmp="leave_bmp";
     9         InputStream inputStream_bpmn=this.getClass().getClassLoader().getResourceAsStream("MyProcess.bpmn");
    10         InputStream inputStream_bmp=this.getClass().getClassLoader().getResourceAsStream("MyProcess.bmp");
    11         DeploymentBuilder builder= repositoryService.createDeployment();
    12         builder.addInputStream(resourceName_bpmn, inputStream_bpmn);
    13         builder.addInputStream(resourceName_bmp, inputStream_bmp);
    14         builder.name("test123");
    15         builder.category("test321");
    16         builder.tenantId("546");
    17         builder.deploy();
    18     }
    View Code

    运行一下上面的代码,接下来我们来看数据库,我们之前说过了,所有re有关的都是和资源有关的,部署资源主要向资源表中写了数据

    首先我们看act_re_deployment,从表名上看,我们可以分析这个表示部署表,一次部署,插入一条数据

    id肯定是标示字段,deploy_time是部署时间,而其他的字段都是在代码中写的,并不知道他们存在的意义,之后流程实例等查询也用不到。暂不考虑,可能是用来区分数据的吧。

    我们再来看表act_re_procdef,从表名上看,我们可以分析出这个表示流程定义表,所有的流程都在这个表中做了声明

    这个表中的字段有点多,但我们可以看字段和数据分析他们都代表什么

    id,当然还是标示,但标示组成是有规律的,流程定义key+流程版本+随机(流水号)

    rev是一个版本号,一般不使用,不考虑

    name流程名称,这个其实是部署的xml资源里面定义的name

    key是部署资源xml里面定义的id

    version就是版本号,

    deployment_id就是部署id,与上面的部署表的标示相关联

    其他字段就不做介绍了,看字段名称及数据,都能猜个大概了。

    这里需要说明的是部署表与流程定义表不是一对一的关系,一次部署可以部署多个流程定义,我们之前使用的activiti设计器,在一个xml中是可以定义多个流程的。

     接下来我们看看act_ge_bytearray这个表,

    这个表里面存储的应该是xml数据及图片数据,这就是我之前说的,如果图片过大,可能无法插入数据。这个表不用过多的去关注。

    流程定义我们已经完成了,现在我们来完成流程的查询

     1 @Test
     2     public void processDefineQuery() throws SQLException, ClassNotFoundException{
     3         String resource="activiti.cfg.xml";
     4         ProcessEngineConfiguration configuration=ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(resource);
     5         ProcessEngine engine=configuration.buildProcessEngine();
     6         RepositoryService repositoryService= engine.getRepositoryService();
     7         ProcessDefinitionQuery definitionQuery= repositoryService.createProcessDefinitionQuery();
     8         definitionQuery.processDefinitionKey("myProcess");
     9         List<ProcessDefinition> list= definitionQuery.list();
    10         if(list!=null){
    11             for(ProcessDefinition definition :list){
    12                 System.out.println("流程定义Id:"+definition.getId());
    13                 System.out.println("流程定义key:"+definition.getKey());
    14                 System.out.println("流程定义资源名:"+definition.getResourceName());
    15                 System.out.println("流程定义版本:"+definition.getVersion());
    16                 System.out.println("流程定义部署Id:"+definition.getDeploymentId());
    17 
    18             }
    19         }
    20 
    21     }
    View Code

    查询api里面有很多方法,可以针对某个流程key查询,也可以设置其他条件,这里只做演示,不做过多的条件查询。

    下面是执行结果

    流程定义Id:myProcess:1:5
    流程定义key:myProcess
    流程定义资源名:leave_bpmn
    流程定义版本:1
    流程定义部署Id:1

    下面进行删除操作,activiti对外暴露的删除最小颗粒度是部署,所以说如果在一次部署中,包含多个流程,这样就造成了多个流程均被删除。所以建议一次部署一个流程定义。

    1 @Test
    2     public void processDefineDelete() throws SQLException, ClassNotFoundException{
    3         String resource="activiti.cfg.xml";
    4         ProcessEngineConfiguration configuration=ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(resource);
    5         ProcessEngine engine=configuration.buildProcessEngine();
    6         RepositoryService repositoryService= engine.getRepositoryService();
    7         repositoryService.deleteDeployment("1");
    8     }
    View Code

    删除api还有个级联删除,这个级联是指后期的流程实例,如果删除部署,启动的流程实例也将被删除,所以该操作需要慎重。但如果不使用级联删除,而又有流程实例存在,该api将会抛出异常。

    activiti不支持流程定义的修改,如果修改只能通过先删除,然后在部署流程。

    下面我们用activiti的接口来查询一下我们部署时使用的资源文件,也就是xml和bmp文件。

    之前我提到了,activiti会将xml及图片的字节数组保存到数据库,以便以后使用。例如程序员可能需要在页面查看流程文件或用户需要查看流程图。

     1 @Test
     2     public void processDefineResource() throws SQLException, ClassNotFoundException, IOException{
     3         String resource="activiti.cfg.xml";
     4         ProcessEngineConfiguration configuration=ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(resource);
     5         ProcessEngine engine=configuration.buildProcessEngine();
     6         RepositoryService repositoryService= engine.getRepositoryService();
     7 
     8         InputStream inputStream_bpmn= repositoryService.getResourceAsStream("1", "leave_bpmn");
     9         InputStream inputStream_bmp= repositoryService.getResourceAsStream("1", "leave_bmp");
    10         File bmpFile=new File("d:/"+"leave_bmp");
    11         File bpmnFile=new File("d:/"+"leave_bpmn");
    12         OutputStream outputStream_bmp=new FileOutputStream(bmpFile);
    13         OutputStream outputStream_bpmn=new FileOutputStream(bpmnFile);
    14         byte[] buffer=new byte[1024];
    15         int length=-1;
    16         while((length=inputStream_bmp.read(buffer, 0, buffer.length))>0){
    17             outputStream_bmp.write(buffer, 0, length);
    18         }
    19         while((length=inputStream_bpmn.read(buffer, 0, buffer.length))>0){
    20             outputStream_bpmn.write(buffer, 0, length);
    21         }
    22         
    23         outputStream_bpmn.close();
    24         outputStream_bmp.close();
    25         inputStream_bmp.close();
    26         inputStream_bpmn.close();
    27     }
    View Code

    接下来可以到磁盘上看我们的资源了,如果磁盘上有图片和xml,那说明我们是可以通过activiti获取资源文件的。

  • 相关阅读:
    P1030 求先序排列 P1305 新二叉树
    spfa
    Clairewd’s message ekmp
    Cyclic Nacklace hdu3746 kmp 最小循环节
    P1233 木棍加工 dp LIS
    P1052 过河 线性dp 路径压缩
    Best Reward 拓展kmp
    Period kmp
    Substrings kmp
    Count the string kmp
  • 原文地址:https://www.cnblogs.com/ljs0322/p/8279261.html
Copyright © 2020-2023  润新知