Activiti学习笔记

一    操作对应表的变化

 

################################
# 部署流程定义涉及到的表

# 流程部署表
SELECT * FROM `act_re_deployment`

# 流程定义表
SELECT * FROM `act_re_procdef`

# 资源文件表
SELECT * FROM `act_ge_bytearray`

# 系统配置表 
SELECT * FROM `act_ge_property`



################################
# 启动流程实例涉及到的表

# 流程实例运行时 执行对象表
SELECT * FROM `act_ru_execution`

# 流程实例运行时 身份联系表
SELECT * FROM `act_ru_identitylink`

# 流程实例运行时 用户任务表
SELECT * FROM `act_ru_task`

# 活动节点历史表
SELECT * FROM `act_hi_actinst`

# 身份联系表 历史
SELECT * FROM `act_hi_identitylink`

# 流程实例表 历史
SELECT * FROM `act_hi_procinst`

# 历史任务表 
SELECT * FROM `act_hi_taskinst`

二   插件安装

  插件名称:Activiti BPMN 2.0 designer

  更新地址:http://activiti.org/designer/update/

三  两种部署方式

  1   classpath加载部署

package com.he;

import java.util.List;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;

public class ProcessTest {

    /**
     * 获取默认流程引擎实例,会自动读取activiti.cfg.xml文件
     */
    private ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();
    
    /**
     * 部署流程定义
     */
    @Test
    public void deploy(){
        Deployment deployment=processEngine.getRepositoryService() // 获取部署相关Service
                .createDeployment() // 创建部署
                .addClasspathResource("diagrams/MyProcess.bpmn") // 加载资源文件
                .addClasspathResource("diagrams/MyProcess.png") // 加载资源文件
                .name("HelloWorld流程") // 流程名称
                .deploy(); // 部署
        System.out.println("流程部署ID:"+deployment.getId()); 
        System.out.println("流程部署Name:"+deployment.getName());
    }
    
    /**
     * 启动流程实例
     */
    @Test
    public void start(){
        ProcessInstance pi=processEngine.getRuntimeService() // 运行时Service
            .startProcessInstanceByKey("myProcess"); // 流程定义表的KEY字段值
        System.out.println("流程实例ID:"+pi.getId());
        System.out.println("流程定义ID:"+pi.getProcessDefinitionId()); 
    }
    
    /**
     * 查看任务
     */
    @Test
    public void findTask(){
        List<Task> taskList=processEngine.getTaskService() // 任务相关Service
            .createTaskQuery() // 创建任务查询
            .taskAssignee("admin") // 指定某个人
            .list();
        for(Task task:taskList){
            System.out.println("任务ID:"+task.getId()); 
            System.out.println("任务名称:"+task.getName());
            System.out.println("任务创建时间:"+task.getCreateTime());
            System.out.println("任务委派人:"+task.getAssignee());
            System.out.println(task.getDelegationState());
            System.out.println("流程实例ID:"+task.getProcessInstanceId());
        }
    }
    
    /**
     * 完成任务
     */
    @Test
    public void completeTask(){
        processEngine.getTaskService() // 任务相关Service
            .complete("2504");
    }
}
View Code

  2  zip加载部署

package com.he;

import java.io.InputStream;
import java.util.zip.ZipInputStream;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.junit.Test;

public class DeployTest {
    
    /**
     * 获取默认流程引擎实例,会自动读取activiti.cfg.xml文件
     */
    private ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();
    
    
    /**
     * 部署流程定义 zip部署方式
     */
    @Test
    public void deployWithZip(){
        InputStream inputStream = this.getClass()
            .getClassLoader()
            .getResourceAsStream("diagrams/MyProcess.zip");
        
        ZipInputStream zipInputStream=new ZipInputStream(inputStream);
        
        Deployment deployment=processEngine.getRepositoryService() // 获取部署相关Service
                .createDeployment() // 创建部署
                .addZipInputStream(zipInputStream)
                .name("HelloWorld流程") // 流程名称
                .deploy(); // 部署
        System.out.println("流程部署ID:"+deployment.getId()); 
        System.out.println("流程部署Name:"+deployment.getName());
    }

}
View Code

 四  流程定义查询

  

package com.he;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.zip.ZipInputStream;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.apache.commons.io.FileUtils;
import org.junit.Test;
import org.springframework.util.FileCopyUtils;

public class DeployTest {
    
    /**
     * 获取默认流程引擎实例,会自动读取activiti.cfg.xml文件
     */
    private ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();
    
    
    /**
     * 部署流程定义 zip部署方式
     */
    @Test
    public void deployWithZip(){
        InputStream inputStream = this.getClass()
            .getClassLoader()
            .getResourceAsStream("diagrams/MyProcess.zip");
        
        ZipInputStream zipInputStream=new ZipInputStream(inputStream);
        
        Deployment deployment=processEngine.getRepositoryService() // 获取部署相关Service
                .createDeployment() // 创建部署
                .addZipInputStream(zipInputStream)
                .name("HelloWorld流程") // 流程名称
                .deploy(); // 部署
        System.out.println("流程部署ID:"+deployment.getId()); 
        System.out.println("流程部署Name:"+deployment.getName());
    }
    
    //查询流程定义    通过key查询,得到一个集合
    @Test
    public void list() {
        String key="myProcess";
        List<ProcessDefinition> list = processEngine.getRepositoryService()
                     .createProcessDefinitionQuery()//创建流程定义查询
                     .processDefinitionKey(key)//通过key查询
                     .list();
        for (ProcessDefinition processDefinition : list) {
            System.out.println(processDefinition.getDescription());
            System.out.println(processDefinition.getVersion());
            System.out.println(processDefinition.getCategory());
        }
    }

    //查询流程定义    通过id查询,得到一个流程定义
    @Test
    public void getProcessDefinitionById() {
        String id="myProcess:2:5004";
        ProcessDefinition processDefinition = processEngine.getRepositoryService()
                     .createProcessDefinitionQuery()//创建流程定义查询
                     .processDefinitionId(id)
                     .singleResult();
        System.out.println(processDefinition.getDescription());
        System.out.println(processDefinition.getVersion());
        System.out.println(processDefinition.getCategory());
    }
    
    //查询流程定义图片      需要根据部署id和资源图片名称来查
    @Test
    public void getImageById() throws IOException {
        String id="myProcess:3:7504";
        ProcessDefinition processDefinition = processEngine.getRepositoryService()
                 .createProcessDefinitionQuery()//创建流程定义查询
                 .processDefinitionId(id)
                 .singleResult();
        String deploymentId=processDefinition.getDeploymentId();
        String resourceName=processDefinition.getDiagramResourceName();//图片名   getResourceName是获取bpmn名
        InputStream inputStream = processEngine.getRepositoryService()
                     .getResourceAsStream(deploymentId, resourceName);
        File file=new File("C:\\Users\\Administrator\\Desktop\\111.png");
        FileUtils.copyInputStreamToFile(inputStream, file);
        
    }
    
    //查询最新版本的流程定义
    @Test
    public  void  getLatestProcessDefinition() {
        List<ProcessDefinition> list = processEngine.getRepositoryService()
                    .createProcessDefinitionQuery()
                    .latestVersion()
                    .list();
        for (ProcessDefinition processDefinition : list) {
            System.out.println(processDefinition.getDeploymentId());
            System.out.println(processDefinition.getVersion());
            System.out.println(processDefinition.getCategory());
        }
    }
    
    //查询一个最新的流程定义对应的所有老版本
    @Test
    public void listAllOldProcessDefinition() {
        List<ProcessDefinition> list = processEngine.getRepositoryService()
                .createProcessDefinitionQuery()
                .latestVersion()
                .list();
        if(list!=null && list.size()>0) {
            ProcessDefinition processDefinition = list.get(0); 
            List<ProcessDefinition> list2 = processEngine.getRepositoryService()
                        .createProcessDefinitionQuery()
                        .processDefinitionKey(processDefinition.getKey())
                        .orderByProcessDefinitionVersion().asc()
                        .list();
            for (ProcessDefinition processDefinition2 : list2) {
                if(processDefinition2.getVersion()==processDefinition.getVersion()) {
                    System.out.println("最新的是:"+processDefinition2.getVersion());
                }
                System.out.println(processDefinition2.getDeploymentId());
                System.out.println(processDefinition2.getVersion());
                System.out.println(processDefinition2.getCategory());
            }
        }
    }

}
View Code

 五  流程定义的 “修改”

  

  首先说下结论,流程定义是不能修改的;

  这里举例子,假如一个流程定义的流程实例在活动运行中。假如可以修改,

  本来要流转到A这个节点,因为流程定义修改了,流转到B这个节点。就不符合当时这个流程实例的初衷了;

  所以一般开发的话,不能修改流程定义,我们是通过增加版本号的方式。来实现“修改”的;

  在设计流程图的时候,这里的Id 对应到数据库里的就是那个Key值  只要Id相同。就算是同一个流程定义;

  比如我们可以发布多次,Id一样,到数据库表那边 Key作为版本属性 值会增加;

  我们一般启动流程实例的时候,我们用Key来启动。这样启动的时候 就是用的最新版本的流程定义来启动流程实例的;

posted on 2018-06-26 13:34  编世界  阅读(150)  评论(0编辑  收藏  举报