第235期 / May 5, 2017

分享到臉書!分享到維特!分享到噗浪!分享到Google+!分享到微博!轉寄友人友善列印

Activiti 技術探討

作者/孫崧閔

[發表日期:2017/5/5]

序論

流程引擎(workflow engine)是指對工作流程和各操作步驟之間所進行傳遞與執行,它主要解決的問題是如何在多個使用者之間,按某種預定的規則自動傳送文件、訊息或者任務,Activiti是一套免費的工作流引擎套件。

Activiti的創始人Tom Baeyens是jBPM的創始人,由於合作夥伴在jBPM的未來架構上產生意見分歧,Tom Baeyensy在2010年離開了JBoss並加入Alfresco公司。Activiti採用了寬鬆的Apache Licence 2.0開源協議,因此它一出現,就得到了開放原始碼社區的大力支持,在社區的支持下,Activiti吸引了更多的工作流專家參與到項目中,這促使了Activiti在工作流領域中的創新,到目前為止,Activiti已經發展到5.23版。


《圖一》Activiti登入畫面


Activiti資料庫設計

在流程的產生、執行以及結束等週期中,Activiti會產生各種與流程相關的數據資料,Activiti提供了完善的資料庫來儲存這些數據。Activiti的資料庫分為五個大部分,例如運行中的資料表會以ACT_RU作為開頭,歷史資料以ACT_HI作為開頭。

一、第一部分通用數據表:


《圖二》


表ACT_GE_BYTEARRAY用於保存與流程引擎相關的資源,只要調用Activiti儲存服務的API,其提供的資源會保存在這個Table中。這個Table設計了一個byte欄位名稱,用來儲存資料的內容,因此理論上它可以保存任何類型的資料。一般情況下,Activiti使用這個Table來保存流程文件的內容和流程圖片內容等。
  • ID_:主鍵,在MySQL中的資料型態為varchar,長度為64。Activiti有自己的主鍵生成策略,每個資料表的ID_值,在整個流程引擎中是唯一的。


  • REV_:數據版本,Activiti為一些有可能會頻繁修改的資料表加入這欄位,用來標示該數據被操作的次數。


  • NAME_:資料名稱,資料型態為varchar,長度為255。


  • DEPLOYMENT_ID_:一次部署可以添加多個資源,該欄位與ACT_RE_DEPLOYMENT的主鍵相關聯。


  • BYTES_:資料內容,資料型態為longblob,最大可存4GB數據。


  • GENERATED_:是否由Activiti自動產生的資源,0表示false,1為true。


《圖三》


Activiti會將流程引擎相關的屬性配置保存到ACT_GE_PROPERTY這個表中,對於一些全域的、可能會發生改變屬性配置,均會放到這表中保存。在初始化流程引擎時,會加入四條屬性數據:historyLevel、next.dbid、schema.history和schema.version。
  • NAME_:屬性名稱,資料型態為varchar,長度為64。


  • VALUE_:屬性值,資料型態為varchar,長度為300。


  • NAME_:資料名稱,資料型態為varchar,長度為255。


  • REV_:數據的版本號。

二、第二部分流程存儲表:

流程引擎中使用存儲表來保存流程定義和部署信息這類資料,存儲表名稱以ACT_RE開頭,RE是repository單字的前兩個字母。


《圖四》


在Activiti中,一次部署可以添加多個model,model會被保存到 ACT_GE_BYTEARRAY表中,而部署信息,則保存到這個ACT_RE_DEPLOYMENT表中。
  • ID_:主鍵,由Activiti按照特定的規則自行產生。


  • NAME_:資料名稱,資料型態為varchar,長度為255,可以調用Activiti的流程存儲API來設置。


  • DEPLOYMENT_TIME_:部署時間,資料型態為timestamp。


《圖五》


Activiti在部署添加資料時,如果發布部署的文件是流程文件(.bpmn或者.bpmn20.xml),其除了會將內容保存到資料表外,還會解析流程文內容,並形成特定的流程定義數據,寫入到流程定義表(ACT_RE_PROCDEF)中。
  • ID_:主鍵,與其他表不同的是,ACT_RE_PROCDEF表的主鍵是組合主鍵。一般表使用一定的規則來產生主鍵。


  • REV_:數據版本號。


  • CATEGORY_:流程定義的分類,讀取流程XML文件中的targetNamespace值。


  • NAME_:流程定義的名稱,讀取流程文件process元素的name值。


  • KEY_:流程定義的key,讀取流程文件中process元素的id值。


  • VERSION:流程定義的版本,如果同一個流程文件被多次部署,那麼該版本號就會往上遞增,若第一條流程定義的數據為1,那麼第二條數據則為2。


  • DEPLOYMENT_ID_:流程定義的對應的部署數據ID。


  • RESOURCE_NAME_:流程定義的對應的資源名稱,一般流程文件的相對路徑。


  • DGRM_RESOURCE_NAME_:流程定義的對應的流程圖資源名稱。


  • HAS_START_FORM_KEY_:流程文件是否有開始表單,可以在開始事件中使用activiti:formKey屬性來配置開始表單。


  • SUSPENSION_STATE_:表示流程定義的狀態是激活還是終止,激活該值為1,終止為2。如果流程定義被設置為終止狀態,那麼將不能啟動流程。

三、第三部分身分數據表:

Activiti的整個身分數據模組,可以獨立於流程引擎而存在。身分數據表並沒有保存流程相關的數據以及關聯。身分表名稱使用ACT_ID開頭,ID是單字identity的前兩個字母。

流程引擎用戶的資訊會被保存在ACT_ID_USER表中。


《圖六》

  • ID_:主鍵,由Activiti自行產生。


  • REV_:數據版本號。


  • FIRST_:名字的名稱。


  • LAST_:名字的姓氏。


  • EMAIL_:用戶信箱。


  • PWD_:用戶密碼。


  • PICTURE_ID_:用戶照片,對應資源中的數據ID。

Activiti將用戶、用戶帳號、用戶訊息分為三種數據。其中用戶表保存用戶的數據而用戶帳號和用戶訊息則被保存到ACT_ID_INFO表中。


《圖七》

  • ID_:主鍵,由Activiti自行產生。


  • REV_:數據版本號。


  • USER_ID_:對應用戶表的數據ID,但沒有強制作外鍵關聯。


  • TYPE_:訊息類型,可以設置用戶帳號(account)、用戶訊息(userinfo)和NULL三種值。


  • KEY_:數據的鍵,可以根據該鍵來尋找用戶訊息的值。


  • VALUE_:數據的值,資料型態為varchar,長度為255。


  • PASSWORD_:用戶帳號的密碼字段。


  • PARENT_ID_:該訊息的父訊息ID。


《圖八》

  • ID_:主鍵,由Activiti自行產生。


  • REV_:數據版本號。


  • NAME_:群組名稱。


  • TYPE_:群組類型,類型不由Activiti提供。

一個群組下可以有多個用戶,同時一個用戶也可以屬於不同的群組,那麼這種多對多的關係,就使用關係表來進行描述,關係表名稱為ACT_ID_MEMBERSHIP。


《圖九》

  • USER_ID_:用戶ID,不能為null。


  • GROUP_ID:群組ID,不能為null。

四、第四部分運行時數據表:

運行時數據表用來保存流程在運行過程中產生的數據。運行時數據表的名稱以ACT_RU開頭,RU是單字runtime的前兩個字母。

當流程啟動後,會產生一個流程實例,同時會產生相應的執行流,流程實例和執行流數據均被保存在ACT_RU_EXECUTION表中。如果一個流程實例只有一條執行流,那麼該表中只產生一條數據。


《圖十》

  • ID_:主鍵,Activiti自行產生。


  • REV_:數據版本號。


  • PROC_INST_ID_:流程實例ID,一個流程實例有可能會產生多個執行流,該欄位表示執行流所屬的流程實例。


  • BUSINESS_KEY_:啟動流程時指定的服務主鍵。


  • PARENT_ID_:執行流的ID,一個流程實例有可能會產生執行流,新的執行流數據以該欄位標示所屬的流程實例。


  • PROC_DEF_ID_:流程定義數據的ID。


  • SUPER_EXEC_:父執行流的ID,一個執行流可以產生新的流程實例。


  • ACT_ID_:當前執行流的ID。


  • IS_ACTIVE_:該執行流是否激活的標示。


  • IS_CONCURRENT_:執行流是否正在運行。


  • IS_SCOPE:是否在執行流範圍內。


  • IS_EVENT_SCOPE:是否在事件範圍內。


  • SUSOWNSION_STATE:標示流程的中斷狀態。


  • IS_SCOPE:流程實體的緩存,取值為0~7。

流程在運行過程中產生的任務數據保存在ACT_RU_TASK中,Activiti也提供了ACT_RU_VARIABLE表來存放流程中的參數,這參數包括流程實例參數、執行流參數和任務參數。


《圖十一》


五、第五部分運行時數據表:

歷史數據就像流程引擎的日誌表。被操作過的流程元素,將會被記錄到歷史表中。歷史數據表名稱以ACT_HI開頭,HI單字是history的前兩個字母。

流程實例的歷史數據會被保存到ACT_HI_PROCINST表中,只要流程被啟動,Activiti就會將流程實例的數據寫入ACT_HI_PROCINST中。除了基本的流程字段外,與運行時數據表不同的是,歷史流程實例表還會記錄流程的開始活動ID、結束活動ID等訊息。


《圖十二》


流程明細表(ACT_HI_DETAIL)會記錄流程執行過程中的參數或者表單數據。


《圖十三》


歷史行為表(ACT_HI_ACTINST)會記錄每一個流程活動的實例,一個流程活動將會被記錄為一條數據。


《圖十四》


流程實例

假設我們設計一個物品領用流程的設計圖,名稱取名為itemApply_V1,則一開始有三條路線選擇例如一般職員關卡或是科長以上關卡或是其它職員關卡,設計好Model後可以把它Deployed在Activiti上,左上角圓圈代表開始右下角圓圈代表結束。


《圖十五》



《圖十六》


在Deployments看到剛剛設計的Model有在上面就可以開始測試剛剛設計好的流程了。接著我們執行完第一關流程可以到ACT_RU_TASK表來看有沒有剛剛設計好的Model跑的資料,有的話代表這個流程是可成功執行的。


《圖十七》


可以看到剛剛設計好的流程,ID_是770013下一關ASSIGNEE_給編號是00404的人。

系統特點
  • 完整的應用程式存取介面(API)。


  • 二多面向的流程設計方式。


  • 原生支持Spring。


  • 整合JPA。


  • 支援REST。

結論

Activiti是開源的技術,且是基於Apache License。Activiti的核心是一個Java且具備快速和穩定的BPMN2的流程引擎,而且它是一個輕量級的企業流程管(BPM)理平台。執行環境上,Activiti可部署於任何Java應用程式伺服器或雲端作業。

Activiti適用於當今主流的資料庫系統,例如H2、mySQL、Oracle、PostgresSQL、MS SQL Server、DB2。在預設資料表結構採用分離式設計方式,也就是說正在執行的資料(流程實例)將會與流程結束以歸檔的資料分開存放,此種聰明的系統設計可完全性的避免日積月累產生的大量資料,拖慢系統的存取效率,進而節省硬體維護資源。

參考資料

1.Activiti官方網站
2.瘋狂Workflow(基於Activiti的工作流應用開發)書 楊恩雄 編著