1. 程式人生 > 實用技巧 >Activiti7的基本原理和使用

Activiti7的基本原理和使用

什麼是工作流?

工作流介紹

  • 工作流(Workflow),就是通過計算機對業務流程自動化執行管理。它主要解決的是“使在多個參與者之間按照某種預定義的規則自動進行傳遞文件、資訊或任務的過程,從而實現某個預期的業務目標,或者促使此目標的實現”。

工作流系統

概述

  • 一個軟體系統中具有工作流的功能,我們把它稱為工作流系統。
  • 一個系統中工作流的功能是什麼?就是對系統的業務流程進行自動化管理,所以工作流是建立在業務流程的基礎上,所以一個軟體的系統核心根本上還是系統的業務流程,工作流只是協助進行業務流程管理。
  • 即使沒有工作流業務系統也可以開發執行,只不過有了工作流可以更好的管理業務流程,提高系統的可擴充套件性。

使用行業

  • 消費品行業,製造業,電信服務業,銀證險等金融服務業,物流服務業,物業服務業,物業管理,大中型進出口貿易公司,政府事業機構,研究院所及教育服務業等,特別是大的跨國企業和集團公司。

具體應用

  • 關鍵業務流程:訂單、報價處理、合同稽核、客戶電話處理、供應鏈管理等。
  • 行政管理類:出差申請、加班申請、請假申請、用車申請、各種辦公用品申請、購買申請、日報週報等凡是原來手工流轉處理的行政表單。
  • 人事管理類:員工培訓安排、績效考評、職位變動處理、員工檔案資訊管理等。
  • 財務相關類:付款請求、應收款處理、日常報銷處、出差報銷、預算和計劃申請等。
  • 客戶服務類:客戶資訊管理、客戶投訴、請求處理、售後財務管理等。
  • 特殊服務類:ISO系統對應流程、質量管理對應流程、產品資料資訊管理、貿易公司報關處理、物流公司貨物跟蹤處理等各種通過表單逐步手動流轉完成的任務均可應用工作流軟體自動規範實施。

工作流實現方式

  • 在沒有專門的工作流引擎之前,我們之前為了實現流程控制,通常的做法就是採用狀態欄位的值來跟蹤流程的變化情況。這樣不同角色的使用者,通過狀態欄位的取值來決定記錄是否顯示。
  • 針對有許可權可以檢視的記錄,當前使用者根據自己的角色來決定審批是否是合格的操作。如果合格將狀態欄位設定一個值,來代表合格;當然如果不合格也需要設定一個值來代表不合格的情況。
  • 這是一種最為原始的方式。通過狀態欄位雖然做到了流程控制,但是當我們的流程發生變更的時候,這種方式所編寫的程式碼也要進行調整。
  • 那麼有沒有專業的方式來實現工作流的管理呢?並且可以做到業務流程變化之後,我們的程式可以不用改變,如果可以實現這樣的效果,那麼我們的業務系統的適應能力就得到了極大提升。答案就是採用工作流引擎。

工作流實現原理分析

  • 如何做到我們在業務流程發生變更後,我們的業務系統程式碼可以不發生改變?原理如下:

  • 將業務流程的每個節點讀取到資料庫中,這樣每個節點(包括開始節點和結束節點)就是資料庫中的一條記錄,當發生業務流程的時候,不斷的從業務流程圖中讀取下一個節點,其實就相當於操作節點對應的資料庫記錄,這樣就實現流程管理和狀態欄位無關。

什麼是Activiti7?

Activiti7介紹

概述

  • Alfresco 軟體在 2010 年 5 月 17 日宣佈 Activiti 業務流程管理(BPM)開源專案的正式啟動, 其
    首席架構師由業務流程管理 BPM 的專家 Tom Baeyens 擔任, Tom Baeyens 就是原來 jbpm 的架構師,
    而 jbpm 是一個非常有名的工作流引擎,當然 activiti 也是一個工作流引擎。
  • Activiti 是一個工作流引擎, activiti 可以將業務系統中複雜的業務流程抽取出來,使用專門的
    建模語言(BPMN2.0)進行定義,業務系統按照預先定義的流程進行執行,實現了業務系統的業務
    流程由 activiti 進行管理,減少業務系統由於流程變更進行系統升級改造的工作量,從而提高系統的
    健壯性,同時也減少了系統開發維護成本。
  • 官方網站

Activiti7內部核心機制

  • 1️⃣業務流程圖要規範化,需要遵守一套標準。
  • 2️⃣業務流程圖本質上就是一個XML檔案,而XML可以存放所要的資料。
  • 3️⃣讀取業務流程圖的過程就是解析XML檔案的過程。
  • 4️⃣讀取一個業務流程圖的結點就相當於解析一個XML的結點,進一步將資料插入到MySQL表中,形成一條記錄。
  • 5️⃣將一個業務流程圖的所有節點都讀取並存入到MySQL表中。
  • 6️⃣後面只要讀取MySQL表中的記錄就相當於讀取業務流程圖的一個節點。
  • 7️⃣業務​流程的推進,後面就轉換為讀取表中的資料,並且處理資料,結束的時候這一行資料就可以刪除了。

BPM

  • BPM(Business Process Management),即業務流程管理,是一種以規範化的構造端到端的卓越業務流程為中心,以持續的提高組織業務績效為目的的系統化方法,常見商業管理教育如EMBA、MBA等均將BPM包含在內。

  • 企業流程管理主要是對企業內部改革,改變企業只能管理機構重疊、中間層次多、流程不閉環等,做到機構不重疊、業務不復雜,達到縮短流程週期、節約運作資本、提高企業效益的作用。

  • 比較下面的兩個人事加薪流程,那個效率更高?

    • 流程一:
    graph LR F[人事加薪流程] A[制定加薪計劃]-->B[部門經理審批] B-->C[總經理審批] C-->D[財務經理審批]
    • 流程二:
    graph LR F[人事加薪流程] A[制定加薪計劃]-->B[部門經理審批] B-->C{1萬元} C-->|1萬元以內|D[財務經理審批] C-->|1萬元以上|E[總經理審批]
    • 上面的兩個流程的區別在於第二個流程在執行時,如果本次加薪金額在一萬元內不再由總經理審批將比第一個流程縮短流程週期,從而提高效率。
  • 比較下面的兩個看病的流程,那個效率更高?

    • 流程一:
    graph LR F[病人看病流程] A[病人去醫院看病]-->B[掛號] B-->C[看病] C-->D[交費] D-->E[取藥]
    • 流程二:
    graph LR E[病人看病流程] A[病人去醫院看病]-->B[掛號] B-->C[看病] C-->D[交費取藥]
    • 上面的兩個流程的區別在於第二個流程將交費和取藥放在一起進行,這樣導致的結果是此視窗的工作人員必須具有財務、藥學專業知識,崗位強度加大,人員培訓難度加大從而導致人員不易擴充套件,工作效率低下。

BPM軟體

  • BPM軟體就是根據企業中業務環境的變化,推進人和人之間、人和系統之間以及系統和系統之間的整合及調整的經營方法和解決方案的IT工具。通常以Internet方式實現資訊傳、資料同步、業務監控和企業業務流程的持續升級優化,從而實現跨應用、跨部門、誇合作伙伴和客戶的企業運作。通過BPM軟體對企業內部及外部的業務流程的整個生命週期進行建模、自動化、管理監控和優化,使企業成本降低,利潤得以大幅度提升。
  • BPM軟體在企業中應用領域廣泛,凡是有業務流程的地方都可以用BPM軟體進行管理,比如企業人事辦公管理、採購流程管理、公文審批流程管理、財務管理等。

BPMN

  • BPMN(Business Process Model And Notation),業務流程模型和符號,是由BPMI(Business Process Management Initiative)開發的一套的業務流程建模符號,使用BPMN提供的符號可以建立業務流程。2004年5月釋出了BPMN1.0規範。BPMI於2005年9月併入OMG(The Object Management Group,物件管理組織)組織。OMG於2011年1月釋出BPMN2.0的最終版本。

  • BPMN是目前被各BPM廠商廣泛接受的BPM標準。Activit就是使用BPMN2.0進行流程建模、流程執行管理,它包括很多的建模符號。

    • 比如:

      • Event用一個圓圈表示,它是流程中執行過程中發生的事情。

      • 活動用圓形矩形表示,一個流程由一個活動或多個活動組成。

  • 一個BPMN的例子:

    • 首先當事人發起一個請假單;
    • 其次他所在部門的經理對請假單進行稽核;
    • 然後人事經理進行復核並進行備案;
    • 最後請假流程結束。

  • BPMN其實是用XML表示業務流程的,上面的.bpmn檔案使用文字編輯器開啟:
<?xml version="1.0" encoding="utf-8"?>

<bpmn2:definitions xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="sample-diagram" targetNamespace="http://bpmn.io/schema/bpmn" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
  <bpmn2:process id="process1596086637078" name="流程1596086637078">
    <bpmn2:startEvent id="StartEvent_01ydzqe" name="開始">
      <bpmn2:outgoing>SequenceFlow_13g4uaz</bpmn2:outgoing>
    </bpmn2:startEvent>
    <bpmn2:userTask id="UserTask_1lf9x0v" name="填寫請假單">
      <bpmn2:incoming>SequenceFlow_13g4uaz</bpmn2:incoming>
      <bpmn2:outgoing>SequenceFlow_0yljdna</bpmn2:outgoing>
    </bpmn2:userTask>
    <bpmn2:sequenceFlow id="SequenceFlow_13g4uaz" sourceRef="StartEvent_01ydzqe" targetRef="UserTask_1lf9x0v"/>
    <bpmn2:userTask id="UserTask_0xa95fp" name="部門經理審批">
      <bpmn2:incoming>SequenceFlow_0yljdna</bpmn2:incoming>
      <bpmn2:outgoing>SequenceFlow_0wc7wvy</bpmn2:outgoing>
    </bpmn2:userTask>
    <bpmn2:sequenceFlow id="SequenceFlow_0yljdna" sourceRef="UserTask_1lf9x0v" targetRef="UserTask_0xa95fp"/>
    <bpmn2:userTask id="UserTask_1p57lka" name="人事複核">
      <bpmn2:incoming>SequenceFlow_0wc7wvy</bpmn2:incoming>
      <bpmn2:outgoing>SequenceFlow_0o4nsg1</bpmn2:outgoing>
    </bpmn2:userTask>
    <bpmn2:sequenceFlow id="SequenceFlow_0wc7wvy" sourceRef="UserTask_0xa95fp" targetRef="UserTask_1p57lka"/>
    <bpmn2:endEvent id="EndEvent_05yb7io" name="結束">
      <bpmn2:incoming>SequenceFlow_0o4nsg1</bpmn2:incoming>
    </bpmn2:endEvent>
    <bpmn2:sequenceFlow id="SequenceFlow_0o4nsg1" sourceRef="UserTask_1p57lka" targetRef="EndEvent_05yb7io"/>
  </bpmn2:process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="process1596086637078">
      <bpmndi:BPMNShape id="StartEvent_01ydzqe_di" bpmnElement="StartEvent_01ydzqe">
        <dc:Bounds x="382" y="82" width="36" height="36"/>
        <bpmndi:BPMNLabel>
          <dc:Bounds x="389" y="58" width="22" height="14"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="UserTask_1lf9x0v_di" bpmnElement="UserTask_1lf9x0v">
        <dc:Bounds x="490" y="60" width="100" height="80"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="SequenceFlow_13g4uaz_di" bpmnElement="SequenceFlow_13g4uaz">
        <di:waypoint x="418" y="100"/>
        <di:waypoint x="490" y="100"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="UserTask_0xa95fp_di" bpmnElement="UserTask_0xa95fp">
        <dc:Bounds x="700" y="60" width="100" height="80"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="SequenceFlow_0yljdna_di" bpmnElement="SequenceFlow_0yljdna">
        <di:waypoint x="590" y="100"/>
        <di:waypoint x="700" y="100"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="UserTask_1p57lka_di" bpmnElement="UserTask_1p57lka">
        <dc:Bounds x="910" y="60" width="100" height="80"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="SequenceFlow_0wc7wvy_di" bpmnElement="SequenceFlow_0wc7wvy">
        <di:waypoint x="800" y="100"/>
        <di:waypoint x="910" y="100"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="EndEvent_05yb7io_di" bpmnElement="EndEvent_05yb7io">
        <dc:Bounds x="1152" y="82" width="36" height="36"/>
        <bpmndi:BPMNLabel>
          <dc:Bounds x="1159" y="125" width="22" height="14"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="SequenceFlow_0o4nsg1_di" bpmnElement="SequenceFlow_0o4nsg1">
        <di:waypoint x="1010" y="100"/>
        <di:waypoint x="1152" y="100"/>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn2:definitions>

Activiti如何使用

整合Activiti

  • Activiti是一個工作流引擎,業務系統使用Activiti來對系統的業務流程進行自動化管理,為了方便業務系統訪問(操作)Activiti的介面或功能,通常將Activiti和業務系統的環境整合在一起。

實現業務流程建模,使用BPMN實現業務流程圖

  • 使用Activiti流程建模工具(Activity-designer)定義業務流程(.bpmn檔案)。

  • .bpmn檔案就是業務流程定義檔案,通過xml定義業務流程。

  • 如果使用其他公司開發的工作引擎一般都提供了視覺化的建模工具(Process Designer)用於生成流程定義檔案,建模工具操作直觀,一般都支援圖形化拖拽方式、多視窗的使用者介面、豐富的過程圖形元素、過程元素拷貝、貼上、刪除等功能。

部署業務流程到Activiti

  • 向Activiti部署業務流程定義(.bpmn檔案)。
  • 使用Activiti提供的API向Activiti中部署.bpmn檔案(一般情況下還需要一起部署業務流程的圖片.png)。

啟動流程例項(ProcessInstance)

  • 啟動一個流程例項表示開始一次業務流程的執行,比如員工請假流程部署完成,如果張三要請假就可以啟動一個流程例項,如果李四要請假也需要啟動一個流程例項,兩個流程的執行互不影響,就好比定義一個Java類,例項化兩個Java物件一樣,部署的流程就好比Java類,啟動一個流程例項就好比new一個Java物件。

查詢待辦任務(Task)

  • 因為現在系統的業務流程已經交給Activiti管理,通過Activiti就可以查詢當前流程執行到哪裡了,當前使用者需要辦理什麼任務了,這些Activiti幫我們管理了,而不像傳統方式中需要我們在SQL語句中的WHERE條件中指定當前查詢的狀態值是多少。。

處理待辦任務

  • 使用者查詢待辦任務後,就可以辦理某個任務,如果這任務辦理完成還需要其他使用者辦理,比如採購單建立後由部門經理稽核,這個過程也是由Activiti幫我們完成了,不需要我們在程式碼中硬編碼指定下一個任務辦理人了。

結束流程

  • 當任務辦理完成沒有下一個任務/結點了,這個流程例項就完成了。

環境準備

開發環境

Java環境

  • JDK14。

資料庫

  • MySQL5.7。

Web容器

  • Tomcat8.5。

開發工具

  • MySQL客戶端連線工具:Navicat for MySQL。
  • 檔案編輯器NotePad++或其他。
  • Java開發工具:IDEA(Eclipse)。

Activiti環境

  • Activiti7預設支援Spring5。

IDEA中安裝ActivitiDesigner(Activiti流程設計器)

在IDEA中解決actiBPM中文亂碼問題

  • 在IDEA中將File-->Settings-->Editor-->File Encodings修改為UTF-8

  • 在IDEA的Help-->Edit Custom VM Options中末尾新增-Dfile.encoding=UTF-8

  • 在IDEA的安裝目錄的bin目錄下將idea.exe.vmoptions和idea64.exe.vmoptions兩個檔案末尾新增-Dfile.encoding=UTF-8

  • 重啟IDEA即可。

Activiti支援的資料庫

  • Activiti的執行需要資料庫的支撐,支援如下版本:
    • h2。
    • MySQL。
    • Oracle。
    • Db2。
    • postgres。
    • mssql。

建立activiti資料庫

  • 使用的DBMS是MySQL。

  • sql指令碼:

CREATE DATABASE activiti DEFAULT CHARACTER SET utf8mb4;

建立表

  • 通過Java程式建立表。

建立Java工程

  • 通過IDEA建立Maven的Java工程。

加入相關jar包的Maven座標

  • 在Java工程中加入ProcessEngine所需要的jar包,包括:

    • activiti-engine-7.0.0.GA.jar
    • activiti依賴的jar包:mybatis、slf4j、log4j等
    • activiti依賴的spring的jar包
    • 資料庫驅動
    • 第三方資料庫連線池dbcp
    • 單元測試junit
  • pom.xml

<properties>
    <activiti.version>7.0.0.GA</activiti.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-engine</artifactId>
        <version>${activiti.version}</version>
    </dependency>
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-spring</artifactId>
        <version>${activiti.version}</version>
    </dependency>
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-bpmn-model</artifactId>
        <version>${activiti.version}</version>
    </dependency>
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-bpmn-converter</artifactId>
        <version>${activiti.version}</version>
    </dependency>
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-json-converter</artifactId>
        <version>${activiti.version}</version>
    </dependency>
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-bpmn-layout</artifactId>
        <version>${activiti.version}</version>
    </dependency>
    <dependency>
        <groupId>org.activiti.cloud</groupId>
        <artifactId>activiti-cloud-services-api</artifactId>
        <version>7-201802-EA</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.19</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
    <!-- log start -->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.13.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.13.3</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.30</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
        <version>2.13.3</version>
    </dependency>
    <!-- log end -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.5</version>
    </dependency>
    <dependency>
        <groupId>commons-dbcp</groupId>
        <artifactId>commons-dbcp</artifactId>
        <version>1.4</version>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.activiti.cloud.dependencies</groupId>
            <artifactId>activiti-cloud-dependencies</artifactId>
            <version>7.0.0.GA</version>
            <scope>import</scope>
            <type>pom</type>
        </dependency>
    </dependencies>
</dependencyManagement>

日誌檔案log4j2.xml

  • log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--日誌級別以及優先順序排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration後面的status用於設定log4j2自身內部的資訊輸出,可以不設定,當設定成trace時,可以看到log4j2內部各種詳細輸出-->
<configuration status="INFO">
    <!--先定義所有的appender-->
    <appenders>
        <!--輸出日誌資訊到控制檯-->
        <console name="Console" target="SYSTEM_OUT">
            <!--控制日誌輸出的格式-->
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </console>
    </appenders>
    <!--然後定義logger,只有定義了logger並引入的appender,appender才會生效-->
    <!--root:用於指定專案的根日誌,如果沒有單獨指定Logger,則會使用root作為預設的日誌輸出-->
    <loggers>
        <root level="info">
            <appender-ref ref="Console"/>
        </root>
    </loggers>
</configuration>

Activit核心配置檔案activiti-cfg.xml

  • activiti-cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <!--  配置資料來源 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
        <property name="username" value="root"/>
        <property name="url"
                  value="jdbc:mysql://192.168.134.100:3306/activiti?useUnicode=true&amp;characterEncoding=UTF-8&amp;autoReconnect=true&amp;useSSL=false&amp;serverTimezone=GMT%2B8&amp;allowPublicKeyRetrieval=true"/>
        <property name="password" value="123456"/>
        <property name="maxActive" value="3"/>
        <property name="maxIdle" value="1"/>
    </bean>

    <!-- Activiti單獨執行的ProcessEngine配置 -->
    <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        <!-- 資料來源 -->
        <property name="dataSource" ref="dataSource"/>
        <!-- 
            activiti資料庫表處理策略 
                false(預設值):檢查資料庫的版本和依賴庫的版本,如果不匹配就丟擲異常
                true:構建流程引擎時,執行檢查,如果需要就執行更新。如果表不存在,就建立。
                create-drop:構建流程引擎時建立資料庫報表,關閉流程引擎時就刪除這些表。
                drop-create:先刪除表再建立表。
                create:構建流程引擎時建立資料庫表,關閉流程引擎時不刪除這些表
        -->
        <property name="databaseSchemaUpdate" value="true"/>
    </bean>
</beans>

測試

  • 建立ProcessEngineConfiguration,通過ProcessEngineConfiguration建立ProcessEngine,在建立ProcessEngine的同時會自動建立資料庫。

  • 示例:

package com.sunxiaping;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;

/**
 * @author <a href="mailto:[email protected]">weiwei.xu</a>
 * @version 1.0
 * 2020-07-31 6:41
 */
public class ActivitiTest {

    public static void main(String[] args) {
        //建立ProcessEngineConfiguration物件
        ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-cfg.xml");
        //建立ProcessEngine物件
        ProcessEngine processEngine = configuration.buildProcessEngine();
        System.out.println("processEngine = " + processEngine);
    }

}

1️⃣:執行以上程式即可完成Activiti資料庫表的建立,通過改變activiti-cfg.xml中的databaseSchemaUpdate引數的值執行不同的資料表處理策略。

2️⃣:上面的方法createProcessEngineConfigurationFromResource在執行activiti-cfg.xml中找固定的名稱processEngineConfiguration,也可以使用過載方法呼叫,這時就可以不用限定processEngineConfiguration名稱。

public static ProcessEngineConfiguration createProcessEngineConfigurationFromResource(String resource, String beanName) {
  return BeansConfigurationHelper.parseProcessEngineConfigurationFromResource(resource, beanName);
}
  • 此時我們檢視資料庫,發現25張表,結果如下所示:

資料庫表的命名規則

  • Activiti的表都是以ACT_開頭。第二部分是表示表的用途的兩個字母標識。用途也和服務的API對應。
  • ACT_RE_*:'RE'表示Repository。這個字首的表包含了流程定義和流程靜態資源(圖片、規則等等)。
  • ACT_RU_*:'RU'表示Runtime。這些執行時的表,包含流程例項,任務、變數,非同步任務等執行中的資料。Activiti只在流程例項執行過程中儲存這些資料,在流程結束時就會刪除這些記錄。這些執行時表可以一直很小並且速度很快。
  • ACT_HI_*:'HI'表示History。這些表包含歷史資料,比如歷史流程例項,變數,任務等等。
  • ACT_GE_*:'GE'表示General。通用資料,用於不同場景下。