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; -- 所有活動的歷史表(包括開始結束節點)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章