Activiti 工作流引擎

需要引入的POM依赖

<!-- activiti依赖包 -->
<dependency>
  <groupId>org.activiti</groupId>
  <artifactId>activiti-engine</artifactId>
  <version>5.21.0</version>
</dependency>
<!-- 整合Spring使用的Jar包 -->
<dependency>
  <groupId>org.activiti</groupId>
  <artifactId>activiti-spring</artifactId>
  <version>5.21.0</version>
</dependency>

1、创建工作流 25张表

    // 创建表
    @Test
    public void createTable() {
        // 实例化流程对象
        ProcessEngineConfiguration pec = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
        // 初始化数据库连接
        pec.setJdbcDriver("oracle.jdbc.driver.OracleDriver");
        pec.setJdbcUrl("jdbc:oracle:thin:@127.0.0.1:1521:orcl");
        pec.setJdbcUsername("oa");
        pec.setJdbcPassword("oa");
        /**
         * DB_SCHEMA_UPDATE_FALSE : 不能自动创建表, 需要表存在
         * DB_SCHEMA_UPDATE_TRUE : 如果表不存在,自动创建表
         * DB_SCHEMA_UPDATE_CREATE_DROP : 先删除表再创建表
         */
        pec.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
        // 工作流核心对象
        ProcessEngine processEngine = pec.buildProcessEngine();
        System.out.println("processEngine:"+processEngine);
    }

2、 通过配置文件,创建工作流所需要的25张表

activiti.cfg.xml 文件

<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        <property name="jdbcDriver" value="oracle.jdbc.driver.OracleDriver"></property>
        <property name="jdbcUrl" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"></property>
        <property name="jdbcUsername" value="oa"></property>
        <property name="jdbcPassword" value="oa"></property>
        <property name="databaseSchemaUpdate" value="true"></property>
    </bean>
// 通过配置文件,创建流程引擎需要的25张表
    @Test
    public void createTableByConfig() {
        // 实例化流程对象
        ProcessEngineConfiguration pec = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
        // 工作流核心对象
        ProcessEngine processEngine = pec.buildProcessEngine();
        System.out.println("processEngine:"+processEngine);
    }

3、简单的流程配置

/**
 * 工作流入门实例
 * @author PL
 *
 */
public class HelloWord {
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    // 部署流程定义
    @Test
    public void deploymentProcessDefine() {
        Deployment deployMent = processEngine.getRepositoryService()
                    .createDeployment() // 创建流程部署对象
                    .name("01流程定义")
                    .addClasspathResource("diagrams/FirstTask.bpmn")
                    .addClasspathResource("diagrams/FirstTask.png")
                    .deploy(); // 完成部署
        System.out.println(deployMent.getId()); // 01
        System.out.println(deployMent.getName()); // 01流程定义
        System.out.println(JSON.toJSON(deployMent));
    }

    // 启动流程实例
    @Test
    public void startProcessInstance() {
        String key = "helloword";
        ProcessInstance pi =  processEngine.getRuntimeService()
                    .startProcessInstanceByKey(key);
        System.out.println(pi.getId()); // 2501
        System.out.println(pi.getProcessDefinitionId()); //helloword:1:4
        System.out.println(JSON.toJSONString(pi));
    }

    // 查询当前人的个人任务
    @Test
    public void findMyPersonTask() {
        String assign = "李四";
        List<Task> list = processEngine.getTaskService()
                    .createTaskQuery()
                    .taskAssignee(assign)
                    .list();
        if(null != list && list.size()>0) {
            for (Task task : list) {
                System.out.println("任务id:"+task.getId()); // 2504
                System.out.println("任务办理人:"+task.getAssignee()); 
                System.out.println("任务名称:"+task.getName()); 
                System.out.println("任务创建时间:"+task.getCreateTime());
                System.out.println("流程实例:"+task.getProcessInstanceId()); //2501
                System.out.println("执行对象Id:"+task.getExecutionId()); //2501
            }
        }

    }
    // 完成我的任务
    @Test
    public void finishMyTask() {
        String taskId = "2504";
        processEngine.getTaskService()
            .complete(taskId);
        System.out.println("完成任务,任务ID:"+taskId); // 2504
    }
}

4、流程定义详解

/**
 * 流程定义Test
 * @author Pl
 *
 */
public class ProcessDefinitionTest {

    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    /**
     * 部署流程定义
     * ACT_RE_DEPLOYMENT 部署对象表  ,部署的对象简要信息
     * ACT_RE_PROCDEF 流程定义表 , 里面包含部署Id, key , version
     * ACT_GE_BYTEARRAY : 资源文件表 
     */
    @Test
    public void deploymentProcessDefine() {
        Deployment deployMent = processEngine.getRepositoryService()
                    .createDeployment() // 创建流程部署对象
                    .name("流程定义")
                    .addClasspathResource("diagrams/FirstTask.bpmn")
                    .addClasspathResource("diagrams/FirstTask.png")
                    .deploy(); // 完成部署
        System.out.println(deployMent.getId()); // 01  //7501
        System.out.println(deployMent.getName()); // 01流程定义
        System.out.println(JSON.toJSON(deployMent));
    }

    /**
     * 查询流程定义
     */
    @Test
    public void findProcessDefined() {
        List<ProcessDefinition> list = processEngine.getRepositoryService()
                .createProcessDefinitionQuery()
            //  .deploymentId(deploymentId)  // 部署对象Id查询
            //  .processDefinitionId(processDefinitionId) //流程定义Id
            //  .processDefinitionKey(processDefinitionKey) // 流程定义Key
            //  .processDefinitionKeyLike("") // 模糊查询
            //  .orderByDeploymentId().desc(); // 排序
                .list(); // 返回一个集合
            //  .singleResult(); // 返回唯一结果值
            //  .listPage(firstResult, maxResults); // 分页查询
        if(null != list) {
            for (ProcessDefinition processDefinition : list) {
                System.out.println("流程定义Id"+processDefinition.getId());
                System.out.println("流程定义名称"+processDefinition.getName()); // 对应.bpmn中的name属性
                System.out.println("流程定义Key"+processDefinition.getKey()); // 对应.bpmn中 id
                System.out.println("流程定义版本"+processDefinition.getVersion()); //相同Key , 版本升级
            }
        }
    }
    /**
     * 删除流程定义
     */
    @Test
    public void deleteProcessDefined() {
        String deploymentId = "1";
        processEngine.getRepositoryService()
            //  .deleteDeployment(deploymentId); // 不能级联删除,只能删除没有启动的流程,如果启动,抛出异常
                .deleteDeployment(deploymentId,true); // 级联删除, 强制删除
        System.out.println("删除成功");
    }

    // 导入zip 文件
    @Test  
    public void deploymentProcessDefinition_zip() {  
        InputStream in = this.getClass().getClassLoader()  
                .getResourceAsStream("diagrams/helloworld.zip");  
        ZipInputStream zipInputStream = new ZipInputStream(in);  
        Deployment deployment = processEngine.getRepositoryService()// 与流程定义和部署对象相关的service  
                .createDeployment()// 创建一个部署对象  
                .name("流程定义")// 添加部署  
                .addZipInputStream(zipInputStream)// 指定zip格式的文件完成部署  
                .deploy();// 完成部署  
        System.out.println("部署ID:" + deployment.getId());  
        System.out.println("部署名称:" + deployment.getName());  

    }
}

流程处理中的表的介绍



select * from ACT_RE_DEPLOYMENT;  -- 流程部署表

select * from ACT_RE_PROCDEF; -- 流程定义表
---------------------------------------------------
select * from ACT_RU_EXECUTION; --正在执行的执行对象表(没有每节点时,执行对象id与实例id一致)

select * from ACT_HI_PROCINST; -- 流程实例历史表(流程执行的历史)

select * from ACT_RU_TASK; -- 正在执行的任务表(只有usertask 才会显示)

select * from ACT_HI_TASKINST; -- 任务历史表(同上)

select * from ACT_HI_ACTINST; -- 所有活动的历史表(包括开始结束节点)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章