Activiti工作流搭建---初始化數據庫


Activiti介紹

Activiti5是由Alfresco軟件在2010年5月17日發布的業務流程管理(BPM)框架,它是覆蓋了業務流程管理、工作流、服務協作等領域的一個開源的、靈活的、易擴展的可執行流程語言框架。Activiti基於Apache許可的開源BPM平台,創始人Tom Baeyens是JBoss jBPM的項目架構師,它特色是提供了eclipse插件,開發人員可以通過插件直接繪畫出業務

流程圖。

1.工作流引擎

ProcessEngine對象,這是Activiti工作的核心。負責生成流程運行時的各種實例及數據、監控和管理流程的運行。

2. BPMN

業務流程建模與標注(Business Process Model and Notation,BPMN) ,描述流程的基本符號,包括這些圖元如何組合成一個業務流程圖(Business Process Diagram)

 

3. 數據庫

Activiti數據庫支持:

Activiti的后台是有數據庫的支持,所有的表都以ACT_開頭。 第二部分是表示表的用途的兩個字母標識。 用途也和服務的API對應。

ACT_RE_*: 'RE'表示repository。 這個前綴的表包含了流程定義和流程靜態資源 (圖片,規則,等等)。

ACT_RU_*: 'RU'表示runtime。 這些運行時的表,包含流程實例,任務,變量,異步任務,等運行中的數據。 Activiti只在流程實例執行過程中保存這些數據, 在流程結束時就會刪除這些記錄。 這樣運行時表可以一直很小速度很快。

ACT_ID_*: 'ID'表示identity。 這些表包含身份信息,比如用戶,組等等。

ACT_HI_*: 'HI'表示history。 這些表包含歷史數據,比如歷史流程實例, 變量,任務等等。

ACT_GE_*: 通用數據, 用於不同場景下,如存放資源文件。

4. 下載庫activiti

地址:http://activiti.org/download.html

5. 解壓后的目錄

database文件夾中就是關於數據庫的相關文件腳本

create文件夾中就是Activiti所有支持的數據庫腳本文件

 

activiti-engine.jar包中自帶了創建activiti工作流數據庫表的SQL語句和自動初始化數據庫的方法。SQL語句在org.activiti.db.create包下,初始化方法在org.activiti.engine.impl.db.DbSchemaCreate的main方法之中。

 源碼如下:

1
2
3
4
5
6
7
8
9
10
public  class  DbSchemaCreate {
 
   public  static  void  main(String[] args) {
     ProcessEngineConfiguration
       .createProcessEngineConfigurationFromResourceDefault()
       .setDatabaseSchemaUpdate(ProcessEngineConfigurationImpl.DB_SCHEMA_UPDATE_CREATE)
       .buildProcessEngine();
   }
 
}

以上都是以5.21版本的包為例。由第一張圖可以看出兩點:(一)目前activiti支持的數據庫類型有:db2、h2、hsql、mssql、mysql、oracle和postgres數據庫。(二)activiti的數據庫表核心在於engine,identity和history是分離了出來。根據官方指導手冊的說法,activiti的history功能是可以選擇是否開啟的,如果不需要自然不用history相關的表,而identity和用戶以及用戶組相關的表也是不一定需要的,可以使用自己的用戶結構表(具體怎么做還沒有嘗試)。

  初始化數據庫的代碼很簡單,其實際上就是使用配置文件創建了一個工作流引擎,只是將配置項中的databaseSchemaUpdate改成了create,這句就是創建數據庫的含義。下面詳細說一下具體操作步驟,本次操作是基於maven的,不會的需要自己手動導入包,使用maven也是為了不用下載依賴包。數據庫使用的是mysql。開發工具用的eclipse。

  主要步驟有四步:

  1.添加activiti-engine.jar包以及其依賴包到構建路徑

  2.添加mysql-connector-java包,mysql數據庫的驅動包

  3.編寫activiti.cfg.xml配置文件,將其放入classpath下,maven項目就是src/main/resources下就行了。

  4.運行DbSchemaCreate的main方法

  下面是相關操作:

  1.新建一個maven項目,這個就不講了。在pom.xml中添加activiti-engine依賴:

1
2
3
4
5
<dependency>
     <groupId>org.activiti</groupId>
     <artifactId>activiti-engine</artifactId>
     <version> 5.21.0 </version>
</dependency>

  2.添加mysql數據庫驅動依賴

1
2
3
4
5
<dependency>
     <groupId>mysql</groupId>
     <artifactId>mysql-connector-java</artifactId>
     <version> 5.1.38 </version>
</dependency>

  3.在src/main/resources下新建一個文件,命名為activiti.cfg.xml(不能是其它的名字)。在里面配置以下內容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version= "1.0"  encoding= "UTF-8" ?>
<beans xmlns= "http://www.springframework.org/schema/beans"
        xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http: //www.springframework.org/schema/beans
                            http: //www.springframework.org/schema/beans/spring-beans.xsd">
                            
        <bean id= "processEngineConfiguration"  class = "org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration" >      
             <property name= "databaseType"  value= "mysql" ></property> <!-- 數據庫類型,最好配置一下 -->
             <property name= "jdbcUrl"  value= "jdbc:mysql://localhost:3306/activiti" ></property>   <!-- 數據庫URL,我放在名為activiti數據庫中 -->
             <property name= "jdbcDriver"  value= "com.mysql.jdbc.Driver" ></property>   <!-- 數據庫驅動類 mysql是這個,其它的數據庫修改一下即可 -->
             <property name= "jdbcUsername"  value= "root" ></property>  <!-- 連接數據庫的賬號 -->
             <property name= "jdbcPassword"  value= "root" ></property>  <!-- 連接數據庫的密碼 -->
             <!-- <property name= "databaseSchema"  value= "activiti" ></property> --> <!-- 這個屬性可能會用到,后面會進行說明 -->
        </bean>
        
</beans>

  里面的相關配置databaseType,jdbcUrl等5個配置項,改成自己的相符合的就行了。

  4.eclipse中選中項目,右擊選擇Run As->Java Application,在彈出的框Select type中輸入DBSchemaCreate,選擇Matching items中相應的類,點擊OK即可,如圖:

  如果沒什么問題,用工具查看數據庫,應該是能夠看到自動創建出來的25張表的。

  但是有的時候會出現一些問題。oracle數據庫中,如果存在一個用戶建了這些表,而我使用另一個用戶建這些表會失敗。或者是建好表后,將用戶刪除,再重新創建這個用戶,一樣會導致創建表失敗,提示:表或視圖不存在。這個問題的產生與程序執行和oracle數據庫的機制有關。

  首先看程序,啟動項目后會驗證一次數據庫的表結構版本和當前jar包版本是否匹配,這個流程是為了校驗而已。而在初始化數據庫的時候一般不會執行這個校驗,但是當錯誤的判定數據庫的表存在時,會錯誤的進入校驗數據庫表結構版本的分支之中,導致原本數據庫還沒有初始化表,卻去查詢表act_ge_property(存放了版本信息),自然而然地報了表或視圖不存在了。問題在於為什么明明表不存在,卻判定表示存在的。

  查看異常鏈追蹤源代碼會發現其實際上判斷的是表act_ru_execution是否存在。其從DbSqlSession的dbSchemaCreate()方法開始:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public void  dbSchemaCreate() {
   if  (isEngineTablePresent()) {
     String dbVersion = getDbVersion();
     if  (!ProcessEngine.VERSION.equals(dbVersion)) {
       throw  new  ActivitiWrongDbException(ProcessEngine.VERSION, dbVersion);
     }
   else  {
     dbSchemaCreateEngine();
   }
 
   if  (dbSqlSessionFactory.isDbHistoryUsed()) {
     dbSchemaCreateHistory();
   }
 
   if  (dbSqlSessionFactory.isDbIdentityUsed()) {
     dbSchemaCreateIdentity();
   }
}

  這段代碼很清楚地展示了相關關系,先判斷表是否存在,存在就驗證版本號,不存在就創建engine,后面判斷history和identity是否被使用(默認使用),使用了就創建相關的表。這里很明顯就是isEngineTablePresent()返回了true才導致了這個問題,繼續追蹤到這個類中的isTablePresent()方法,其真正作用的是下面這段:

1
2
3
4
5
6
7
8
9
10
11
12
13
public static  String[] JDBC_METADATA_TABLE_TYPES = { "TABLE" };
 
 
      try  {
         tables = databaseMetaData.getTables(catalog, schema, tableName, JDBC_METADATA_TABLE_TYPES);
         return  tables.next();
       finally  {
         try  {
           tables.close();
         catch  (Exception e) {
           log.error( "Error closing meta data tables" , e);
         }
       }

  tables.next()返回了true,那么問題肯定是出在了databaseMetaData.getTables()這條語句上。斷點發現前兩個參數都是null,tableName就是驗證的表act_ru_execution。最后一個上面以給出,就是字符串數組,里面只有一個“TABLE”字符串。這個方法具體出在第二個參數上面。具體的參數含義可以百度,這里提供一個鏈接(勿刪):http://blog.sina.com.cn/s/blog_707a9f0601014y1a.html

  第二個參數對於oracle數據庫來說比較重要,就像之前說的造成這個問題的兩種可能的場景。如果出現了這個問題,就需要配置,使schema這個參數為大寫的登陸用戶名(必須大寫,與oracle的機制有關)。這個參數的設置,不斷向上查找源碼,會發現只需要在配置文件中配置databaseSchema屬性就可以了(value大寫)。mysql數據庫應該就沒有太大問題了。

  最后簡單介紹一下activiti數據庫表的組成。之前看創建數據庫的sql語句就很清楚,表分為必要的engine和非必要的history以及identity。

      其中act_hi_*這8張表就與history相關。act_id_*這4張與identity有關。剩余的全是engine必備的表,也可以簡單的分下類:act_ru_*這6張表是runtime流程運行中相關的表。act_re_*這3張表是repository這個是管理部署和流程定義相關的表,基本不會改變,除非更改部署和流程定義。act_ge_property存放了數據庫表版本的相關信息,只有在升級版本的時候會改變。act_ge_bytearray存放了一些字節流數據,一般是各種資源數據如流程定義的xml,流程圖等。act_evt_log看名字就知道是事件日志的表,如何使用暫時不知。最后一張act_procdef_info表看名字也就是流程定義詳情表。那些歸類了得表具體作用看*,其后綴的名字,大概就知道其具體作用,如:task(任務)、variable(變量)等,這里就不一一介紹了。

 


免責聲明!

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



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