activiti入門學習一


一、什么是Activiti?

  Activiti是一個開源的工作流引擎,它實現了BPMN 2.0規范,可以發布設計好的流程定義,並通過api進行流程調度。Activiti 作為一個遵從 Apache 許可的工作流和業務流程管理開源平台,其核心是基於 Java 的超快速、超穩定的 BPMN2.0 流程引擎,強調流程服務的可嵌入性和可擴展性,同時更加強調面向業務人員。Activiti 流程引擎重點關注在系統開發的易用性和輕量性上。每一項 BPM 業務功能 Activiti 流程引擎都以服務的形式提供給開發人員。通過使用這些服務,開發人員能夠構建出功能豐富、輕便且高效的 BPM 應用程序。說白了activiti是一個業務流程管理引擎,會沿着設計者設計好的流程,一步一步的執行下去,直到終點。

二、activiti配置講解

  • 使用idea開發,需要安裝bpmn插件
    在這里插入圖片描述

  • pom文件

  <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-engine</artifactId>
            <version>7.0.0.Beta1</version>
        </dependency>

        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring</artifactId>
            <version>7.0.0.Beta1</version>
        </dependency>

        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-bpmn-model</artifactId>
            <version>7.0.0.Beta1</version>
        </dependency>

        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-bpmn-converter</artifactId>
            <version>7.0.0.Beta1</version>
        </dependency>

        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-json-converter</artifactId>
            <version>7.0.0.Beta1</version>
        </dependency>

        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-bpmn-layout</artifactId>
            <version>7.0.0.Beta1</version>
        </dependency>

        <dependency>
            <groupId>org.activiti.cloud</groupId>
            <artifactId>activiti-cloud-services-api</artifactId>
            <version>7.0.0.Beta1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.15</version>
        </dependency>
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.4</version>
        </dependency>
  • activiti配置文件 
    在這里插入圖片描述
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
						http://www.springframework.org/schema/contex http://www.springframework.org/schema/context/spring-context.xsd
						http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        <property name="jdbcDriver" value="com.mysql.cj.jdbc.Driver"/>
        <property name="jdbcUrl"  value="jdbc:mysql://127.0.0.1:3306/activiti?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC"/>
        <property name="jdbcUsername" value="root"/>
        <property name="jdbcPassword" value="root"/>
        <property name="databaseSchemaUpdate" value="true"/>
    </bean>
</beans>
  • activiti所需的25張表
 public static void main(String[] args) {
//        ProcessEngineConfiguration cfg = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
//        ProcessEngine processEngine = cfg.buildProcessEngine();
//        System.out.println(processEngine);


//創建方式二  采用默認配置,xml和bean的id  processEngineConfiguration
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
        System.out.println(defaultProcessEngine);
    }

在這里插入圖片描述

 ACT_RE_: RE表示 repository。 這個前綴的表包含了流程定義和流程靜態資源 (圖片,規則,等等)
 
ACT_RU_: RU表示 runtime。 這些運行時的表,包含流程實例,任務,變量,異步任務,等運行中的數據。 Activiti 只在流程實例執行過程中保存這些數據, 在流程結束時就會刪除這些記錄。 這樣運行時表可以一直
很小速度很快。
 
ACT_HI_: HI表示 history。 這些表包含歷史數據,比如歷史流程實例, 變量,任務等等。
 
ACT_GE_
**: GE 表示 general。通用數據, 用於不同場景下。

  • activiti提供的service介紹
    RepositoryService activiti 的資源管理類
     RuntimeService activiti 的流程運行管理類
     TaskService activiti 的任務管理類
     HistoryService activiti 的歷史管理類
     ManagerService activiti 的引擎管理類

三、流程圖定義

在這里插入圖片描述

  • 流程定制
    在這里插入圖片描述
    在這里插入圖片描述
    在這里插入圖片描述
    在這里插入圖片描述
    在這里插入圖片描述

  • 導出圖片
    導出圖片之前需要先將idea的文件配置成utf-8,不然流程定義中的文字會出現亂碼的情況
    在這里插入圖片描述
    在這里插入圖片描述

然后將創建的bpmn后綴名給為xml
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

如果沒有提前修改idea配置文件為utf-8的話,這里會出現亂碼
在這里插入圖片描述

然后在將之前修改成xml的后綴名在修改成bpmn
在這里插入圖片描述

四、單機演示Demo

1、流程定義到數據庫中,此操作影響的表

  public static void main(String[] args) {
        //創建ProcessEngine 對象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //得到 RepositoryService對象
        RepositoryService repositoryService = processEngine.getRepositoryService();
        //開始部署
        Deployment deployment = repositoryService.createDeployment()
                //添加資源
                .addClasspathResource("bpmn/holiday.xml")
                .addClasspathResource("bpmn/holiday.png")
                .name("請假流程審批")
                .deploy();
        System.out.println("流程部署id:" + deployment.getId());

        System.out.println("流程部署名稱:" + deployment.getName());
    }
  • 部署信息
    在這里插入圖片描述

  • 流程定義的信息,唯一的key
    在這里插入圖片描述

  • 定義的bpmn文件和png文件
    在這里插入圖片描述

2、啟動流程實例,此操作影響的表

  public static void main(String[] args) {
        //創建ProcessEngine 對象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //得到 RuntimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();

        //創建流程實例  需要知道流程定義的key
        ProcessInstance holiday = runtimeService.startProcessInstanceByKey("holiday");

        System.out.println("流程部署ID "+holiday.getDeploymentId());
        System.out.println("流程實例ID "+holiday.getId());
        System.out.println("流程的Key "+holiday.getBusinessKey());
        System.out.println("活動Id "+holiday.getActivityId());
    }
  • 已完成的活動信息
    在這里插入圖片描述

  • 參與者信息
    在這里插入圖片描述

  • 流程實例
    在這里插入圖片描述

  • 任務實例
    在這里插入圖片描述

  • 執行表
    在這里插入圖片描述

  • 參與者信息
    在這里插入圖片描述

  • 任務
    在這里插入圖片描述

3、查詢任務

 public static void main(String[] args) {
        //創建ProcessEngine 對象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//獲取TaskService對象
        TaskService taskService = processEngine.getTaskService();


        //根據流程定義的key和負責人查詢當前用戶的任務列表
        List<Task> list = taskService.createTaskQuery()
                .processDefinitionKey("holiday")
                .taskAssignee("wanwu")
                .list();
        for (Task task : list) {
            System.out.println("流程實例Id "+task.getProcessInstanceId());
            System.out.println("任務Id "+task.getId());
            System.out.println("負責人名稱 "+task.getAssignee());
            System.out.println("任務名稱 "+task.getName());

        }

    }

在這里插入圖片描述

4、處理任務

 public static void main(String[] args) {
        //創建ProcessEngine 對象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //獲取TaskService對象
        TaskService taskService = processEngine.getTaskService();

        //處理任務   任務ID2505,上面已經查詢到的
        taskService.complete("2505");

    }
  • 影響的表和啟動實例的時候差不多
    在這里插入圖片描述
    在這里插入圖片描述
    在這里插入圖片描述
    在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述

這個表只存儲當前流程的下一個執行任務

5、流程定義的查詢

   public static void main(String[] args) {
        //創建ProcessEngine 對象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //得到RepositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();

        //得到ProcessDefinitionQuery對象   可以認為是一個查詢器
        ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();

        //設置流程定義的Key
        List<ProcessDefinition> holiday = processDefinitionQuery.processDefinitionKey("holiday")
                //設置排序方式 默認是根據流程定義的版本號排序
                .orderByProcessDefinitionVersion().desc()
                .list();

        for (ProcessDefinition processDefinition : holiday) {
            System.out.println("流程定義的ID " +processDefinition.getId());
            System.out.println("流程定義名稱 " +processDefinition.getName());
            System.out.println("流程定義Key " +processDefinition.getKey());
            System.out.println("流程定義的版本號 " +processDefinition.getVersion());
            System.out.println("流程部署的ID  " +processDefinition.getDeploymentId());
        }
    }

在這里插入圖片描述

6、刪除已部署的流程

 public static void main(String[] args) {
        //創建ProcessEngine 對象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //得到RepositoryService對象
        RepositoryService repositoryService = processEngine.getRepositoryService();

        //執行刪除   參數是部署ID
        //repositoryService.deleteDeployment("2501");

        
        //如果流程沒有執行完成 刪除時候回出錯,如果強制刪除也是可以的是級聯刪除
        //級聯刪除   執行但為完成的也是可以刪除的   true會先刪除沒有完成的流程節點,最后刪除流程定義信息
        repositoryService.deleteDeployment("2501",true);

    }

在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述

流程刪除和流程部署影響的表一樣的
7、流程定義資源查看

  public static void main(String[] args) {
        //創建ProcessEngine 對象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //得到HistoryService
        HistoryService historyService = processEngine.getHistoryService();

        HistoricActivityInstanceQuery historicActivityInstanceQuery = historyService.createHistoricActivityInstanceQuery();

        //查詢條件
        historicActivityInstanceQuery.processInstanceId("5001");

        //執行流程
        List<HistoricActivityInstance> list = historicActivityInstanceQuery
                .orderByHistoricActivityInstanceStartTime().asc()
                .list();
        for (HistoricActivityInstance historicActivityInstance : list) {
            System.out.println(historicActivityInstance.getActivityId());
            System.out.println(historicActivityInstance.getActivityName());
            System.out.println(historicActivityInstance.getProcessDefinitionId());
            System.out.println(historicActivityInstance.getProcessInstanceId());

        }

    }

在這里插入圖片描述

8、使用壓縮包部署Activiti
將流程圖和bpmn文件壓縮成zip格式的

  public static void main(String[] args) {
        //創建ProcessEngine 對象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //得到 RepositoryService對象
        RepositoryService repositoryService = processEngine.getRepositoryService();

        //轉換ZipInputStream流對象
        InputStream is = ActivitiZipDeployment.class.getClass().getClassLoader().getResourceAsStream("bpmn/holiday.zip");

        ZipInputStream zipInputStream = new ZipInputStream(is);

        //開始部署
        Deployment deployment = repositoryService.createDeployment()
                //添加資源
               .addZipInputStream(zipInputStream)
                .name("請假流程審批Zip")
                .deploy();
        System.out.println("流程部署id:" + deployment.getId());

        System.out.println("流程部署名稱:" + deployment.getName());
    }

9、啟動流程實例 增加BusinessKey
流程都是動態的,什么人請假,找上級審批都不是不固定的,這些動態的內容都是不包含在25張表里面的,我們需要自定義表(比如請假,需要請假內容、請假當事人、開始時間、結束時間等。這些都存放在我們自己自定義的請假表里面)然后在將業務系統和activiti關聯。主要是 act_ru_execution 中的BUSINESS_KEY_來和業務表中的主鍵進行關聯

public class BusinessKeyAdd {
    public static void main(String[] args) {
        //創建ProcessEngine 對象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //得到RuntimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();

        //啟動流程實例,同時需要制定業務標識(BusinessKey ==請假表中的ID)
        //流程定義本身的key     業務表中的標識
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("holiday", "1001");

        //輸出相關屬性
        System.out.println(processInstance.getBusinessKey());
    }
}

在這里插入圖片描述
在這里插入圖片描述

10、全部流程掛起與激活

public static void main(String[] args) {
    //創建ProcessEngine 對象
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

    RepositoryService repositoryService = processEngine.getRepositoryService();

    //查詢流程實例
    ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
            .processDefinitionKey("holiday").singleResult();

    //得到當前流程定義的實例是否都為暫停狀態
    boolean suspended = processDefinition.isSuspended();
    String processDefinitionId = processDefinition.getId();
    if (suspended) {
        //說明是暫停,就可以使用激活操作
        repositoryService.activateProcessDefinitionById(processDefinitionId, true, null);
        System.out.println("流程定義:" + processDefinitionId + "激活");
    } else {
        repositoryService.suspendProcessDefinitionById(processDefinitionId, true, null);
        System.out.println("流程定義:" + processDefinitionId + "掛起");
    }
}

在這里插入圖片描述
在這里插入圖片描述

流程定義為掛起狀態時,該流程定義不允許啟動新的流程實例,同時該流程定義下所有的流程實例將全部掛起暫停執行
11、單個流程實例掛起與激活
在這里插入圖片描述

public static void main(String[] args) {
    //創建ProcessEngine 對象
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

    RuntimeService runtimeService = processEngine.getRuntimeService();
    //得到流程實例對象
    ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
            .processDefinitionKey("holiday").singleResult();

    //是否掛起
    boolean suspended = processInstance.isSuspended();

    String processInstanceId = processInstance.getId();

    if (suspended) {
        runtimeService.activateProcessInstanceById(processInstanceId);
        System.out.println("流程 " + processInstanceId + "激活");
    } else {
        runtimeService.suspendProcessInstanceById(processInstanceId);
        System.out.println("流程 " + processInstanceId + "掛起");
    }
}

在這里插入圖片描述
在這里插入圖片描述

在掛起的時候,如果還處理當前實例的任務的時候。會拋出 ActivitiException:Connot complete a suspended task 異常


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM