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

下面我们使用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获取资源文件的。