1. 程式人生 > >工作流引擎Activiti使用自我總結

工作流引擎Activiti使用自我總結

轉載自:工作流引擎Activiti使用總結

1.簡單介工作流引擎與Activiti

對於工作流引擎的解釋請參考百度百科:工作流引擎

1.1 我與工作流引擎

在第一家公司工作的時候主要任務就是開發OA系統,當然基本都是有工作流的支援,不過當時使用的工作流引擎是公司一些牛人開發的(據說是用一個開源的引擎修改的),名稱叫CoreFlow;功能相對Activiti來說比較弱,但是能滿足日常的使用,當然也有不少的問題所以後來我們只能修改引擎的程式碼打補丁。

現在是我工作的第二家公司,因為要開發ERP、OA等系統需要使用工作流,在專案調研階段我先搜尋資料選擇使用哪個開源工作流引擎,最終確定了Activiti5並基於公司的架構做了一些DEMO。

1.2 Activiti與JBPM5?

對於Activiti、jBPM4、jBPM5我們應該如何選擇,在InfoQ上有一篇文章寫的很好,從大的層面比較各個引擎之間的差異,請參考文章:縱觀jBPM:從jBPM3到jBPM5以及Activiti5

1.3 Activiti資料

2.初次使用遇到問題收集

因為Activiti剛剛退出不久所以資料比較空缺,中文資料更是少的可憐,所以開始的時候一頭霧水(雖然之前用過工作流,但是感覺差距很多),而且官方的手冊還不是很全面;所以我把我在學習使用的過程遇到的一些疑問都羅列出來分享給大家;以下幾點是我遇到和想到的,如果你還有什麼疑問可以在評論中和我交流再補充。

2.1 部署流程圖後中文亂碼

亂碼是一直纏繞著國人的問題,之前各個技術、工具出現亂碼的問題寫過很多文章,這裡也不例外……,Activiti的亂碼問題在流程圖中。

流程圖的亂碼如下圖所示:

通過*.bpmn20.xml部署後中文出現亂碼

解決辦法有兩種:

2.1.1 修改原始碼方式

修改原始碼

org.activiti.engine.impl.bpmn.diagram.ProcessDiagramCanvas

在構造方法

public ProcessDiagramCanvas(int width, int height)
中有一行程式碼是設定字型的,預設是用 Arial字型,這就是亂碼產生的原因,把字改為本地的中文字型即可,例如: ?
1 Font font = new Font( "WenQuanYi Micro Hei" , Font.BOLD, 11 );

當然如果你有配置檔案讀取工具那麼可以設定在*.properties檔案中,我就是這麼做的:

?
1 Font font = new Font(PropertyFileUtil.get( "activiti.diagram.canvas.font" ), Font.BOLD, 11 );

5.12版本開始支援設定字型名稱,在引擎中新增如下設定,在生成圖片時即可使用微軟雅黑設定圖片中的文字。

?
1 < property name = "activityFontName" value = "微軟雅黑" ></ property >

2.1.2 使用壓縮包方式部署

Activiti支援部署*.bpmn20.xml、bar、zip格式的流程定義。

使用Activit Deisigner工具設計流程圖的時候會有三個型別的檔案:

  • .activiti設計工具使用的檔案

  • .bpmn20.xml設計工具自動根據.activiti檔案生成的xml檔案

  • .png流程圖圖片

解決辦法就是把xml檔案和圖片檔案同時部署,因為在單獨部署xml檔案的時候Activiti會自動生成一張流程圖的圖片檔案,但是這樣在使用的時候座標和圖片對應不起來……

所以把xml和圖片同時部署的時候Activiti自動關聯xml和圖片,當需要獲取圖片的時候直接返回部署時壓縮包裡面的圖片檔案,而不是Activiti自動生成的圖片檔案

2.1.2.1 使用工具打包Bar檔案

在“Package Explorer”檢視中右鍵專案名稱然後點選“Create deployment artifacts”,會在src目錄中建立deployment資料夾,裡面包含*.bar檔案.

2.1.2.2 使用Ant指令碼打包Zip檔案

這也是我們採用的辦法,你可以手動選擇xml和png打包成zip格式的檔案,也可以像我們一樣採用ant target的方式打包這兩個檔案。

123456789101112
<div class="line" id="file-build-xml-LC1"><span class="cp" style="color:#999999;font-weight:bold"><?xml version="1.0" encoding="UTF-8"?></span></div><div class="line" id="file-build-xml-LC2"><span class="nt" style="color:navy;"><project</span> <span class="na" style="color:teal;">name=</span><span class="s" style="color:#dd1144;">"foo"</span><span class="nt" style="color:navy;">></span></div><div class="line" id="file-build-xml-LC3"> </div><div class="line" id="file-build-xml-LC4">    <span class="nt" style="color:navy;"><property</span> <span class="na" style="color:teal;">name=</span><span class="s" style="color:#dd1144;">"workflow.definition"</span> <span class="na" style="color:teal;">value=</span><span class="s" style="color:#dd1144;">"foo-common-core/src/main/resources/diagrams"</span> <span class="nt" style="color:navy;">/></span></div><div class="line" id="file-build-xml-LC5">    <span class="nt" style="color:navy;"><property</span> <span class="na" style="color:teal;">name=</span><span class="s" style="color:#dd1144;">"workflow.deployments"</span> <span class="na" style="color:teal;">value=</span><span class="s" style="color:#dd1144;">"foo-common-core/src/main/resources/deployments"</span> <span class="nt" style="color:navy;">/></span></div><div class="line" id="file-build-xml-LC6"> </div><div class="line" id="file-build-xml-LC7"><span class="nt" style="color:navy;"><target</span> <span class="na" style="color:teal;">name=</span><span class="s" style="color:#dd1144;">"workflow.package.oa.leave"</span><span class="nt" style="color:navy;">></span></div><div class="line" id="file-build-xml-LC8">		<span class="nt" style="color:navy;"><echo></span>打包流程定義及流程圖::OA-請假<span class="nt" style="color:navy;"></echo></span></div><div class="line" id="file-build-xml-LC9">		<span class="nt" style="color:navy;"><zip</span> <span class="na" style="color:teal;">destfile=</span><span class="s" style="color:#dd1144;">"${workflow.deployments}/oa/leave.zip"</span> <span class="na" style="color:teal;">basedir=</span><span class="s" style="color:#dd1144;">"${workflow.definition}/oa/leave"</span> <span class="na" style="color:teal;">update=</span><span class="s" style="color:#dd1144;">"true"</span></div><div class="line" id="file-build-xml-LC10">			<span class="na" style="color:teal;">includes=</span><span class="s" style="color:#dd1144;">"*.xml,*.png"</span> <span class="nt" style="color:navy;">/></span></div><div class="line" id="file-build-xml-LC11">	<span class="nt" style="color:navy;"></target></span></div><div class="line" id="file-build-xml-LC12"><span class="nt" style="color:navy;"></project></span></div>
view raw build.xml hosted with ❤ by  GitHub

這樣當修改流程定義檔案後只要執行ant命令就可以打包了:

ant workflow.package.oa.leave

現在部署bar或者zip檔案檢視流程圖圖片就不是亂碼了,而是你的壓縮包裡面的png檔案。

2.2 使用引擎提供的Form還是自定義業務Form

2.2.1 引擎提供的Form

定義表單的方式在每個Task標籤中定義extensionElementsactiviti:formProperty即可,到達這個節點的時候可以通過API讀取表單元素。

Activiti官方的例子使用的就是在流程定義中設定每一個節點顯示什麼樣的表單哪些欄位需要顯示、哪些欄位只讀、哪些欄位必填。

但是這種方式僅僅適用於比較簡單的流程,對於稍微複雜或者頁面需要業務邏輯的判斷的情況就不適用了。

對於資料的儲存都是在引擎的表中,不利於和其他表的關聯、對整個系統的規劃也不利!

2.2.2 自定義業務Form

這種方式應該是大家用的最多的了,因為一般的業務系統業務邏輯都會比較複雜,而且資料庫中很多表都會有依賴關係,表單中有很多狀態判斷。

例如我們的系統適用jQuery UI作為UI,有很多javascript程式碼,頁面的很多操作需要特殊處理(例如:多個選項的互斥、每個節點根據型別和操作人顯示不同的按鈕);基本每個公司都有一套自己的UI風格,要保持多個系統的操作習慣一致只能使用自定義表單才能滿足。

2.3 業務和流程的關聯方式

這個問題在群裡面很多人都問過,這也是我剛剛開始迷惑的地方;

後來看了以下API發現RuntimeService有兩個方法:

2.3.1 startProcessInstanceByKey

javadoc對其說明:

startProcessInstanceByKey(String processDefinitionKey, Map variables) 
          Starts a new process instance in the latest version of the process definition with the given key

其中businessKey就是業務ID,例如要申請請假,那麼先填寫登記資訊,然後(儲存+啟動流程),因為請假是單獨設計的資料表,所以儲存後得到實體ID就可以把它傳給processInstanceBusinessKey方法啟動流程。當需要根據businessKey查詢流程的時候就可以通過API查詢:

?
1 runtimeService.createProcessInstanceQuery().processInstanceBusinessKey(processInstanceBusinessKey, processDefinitionKey)

建議資料庫冗餘設計:在業務表設計的時候新增一列:PROCESS_INSTANCE_ID varchar2(64),在流程啟動之後把流程ID更新到業務表中,這樣不管從業務還是流程都可以查詢到對方!

特別說明: 此方法啟動時自動選擇最新版本的流程定義。

2.3.2 startProcessInstanceById

javadoc對其說明:

startProcessInstanceById(String processDefinitionId, String businessKey, Map variables) 
          Starts a new process instance in the exactly specified version of the process definition with the given id.

processDefinitionId:這個引數的值可以通過repositoryService.createProcessDefinitionQuery()方法查詢,對應資料庫:ACT_RE_PROCDEF;每次部署一次流程定義就會新增一條資料,同名的版本號累加。

特別說明: 此可以指定不同版本的流程定義,讓使用者多一層選擇。

2.3.3 如何選擇

建議使用startProcessInstanceByKey,特殊情況需要使用以往的版本選擇使用startProcessInstanceById

2.4 同步使用者資料

這個問題也是比較多的人詢問過,Activiti支援對任務分配到:指定人、指定組、兩者組合,而這些人和組的資訊都儲存在ACT_ID..表中,有自己的使用者和組(角色)管理讓很多人不知所措了;原因是因為每個系統都會存在一個許可權管理模組(維護:使用者、部門、角色、授權),不知道該怎麼和Activiti同步。

2.4.1 建議處理方式

Activiti有一個IdentityService介面,通過這個介面可以操控Activiti的ACT_ID_*表的資料,一般的做法是用業務系統的許可權管理模組維護使用者資料,當進行CRUD操作的時候在原有業務邏輯後面新增同步到Activiti的程式碼;例如新增一個使用者時同步Activiti User的程式碼片段:

1234567891011121314151617181920212223

相關推薦

工作引擎Activiti使用總結

1.簡單介工作流引擎與Activiti 對於工作流引擎的解釋請參考百度百科:工作流引擎 1.1 我與工作流引擎 在第一家公司工作的時候主要任務就是開發OA系統,當然基本都是有工作流的支援,不過當時使用的工作流引擎是公司一些牛人開發的(據說是用一個開源的引擎修改的),名稱叫CoreFlow;功

工作引擎Activiti使用自我總結

轉載自:工作流引擎Activiti使用總結 1.簡單介工作流引擎與Activiti 對於工作流引擎的解釋請參考百度百科:工作流引擎 1.1 我與工作流引擎 在第一家公司工作的時候主要任務就是開發OA系統,當然基本都是有工作流的支援,不過當時使用的工作流引擎是公司一些牛人開發的(據

工作引擎activiti

一。activiti簡介      Activiti專案是一項新的基於Apache許可的開源BPM平臺,從基礎開始構建,旨在提供支援新的BPMN 2.0標準,包括支援物件管理組(OMG),面對新技術的機遇,諸如互操作性和雲架構,提供技術實現。       創始人Tom Bae

工作引擎Activiti系列(一)——初識

1、介紹     幾乎任何一個公司的軟體開發都會涉及到流程,以往我們可能是這麼實現的:業務表新增標誌位標識流程的節點狀態,關聯批註表實現稽核意見,根據一些業務資料分析處理邏輯,分配任務到使用者,節點的排程,審批等.....這其實是很繁瑣的,且不說開發起來比較混亂,維護起來更

工作引擎Activiti與SpringBoot2整合--開源軟體誕生17

開源ERP技術整合系列--第17篇 用日誌記錄“開源軟體”的誕生 【點亮星標】----祈盼著一個鼓勵 博主開源地址: 碼雲:https://gitee.com/redragon/redragon-erp GitHub:https://github.com/redragon1985/redragon-erp

Activiti工作引擎學習總結

經過這三天對與Activiti的軟磨硬泡,也算是小有所獲。 想要學會工作流引擎其實很簡單,搞清楚processengine (Activiti引擎),並且理解其中幾大服務介面: 服務:    reposit

馳騁工作引擎JFlow與activiti的對比 -總結

共同點: 1. 嵌入式的工作流引擎,降低叢集複雜性。 2. 嚴格而靈活的流程版本控制 3. 支援多種資料庫 4. 支援多種流程設計模式 5. 成熟度高的開源工作流,具有可靠的穩定性和效能。 區別: 1. 流程定義方式: ACTIVITI :採用xml的方式,通過拼字串的方式完成,所以流程定

Activiti工作引擎web設計不顯示問題總結

首先開啟官網地址:http://mvnrepository.com/artifact/org.activiti/activiti-webapp-explorer2下載最新的war包,然後解壓後,放到tomcat的webapp下。1、首先要將應用名稱改為activiti-exp

Activiti工作引擎數據庫表結構

activit let repr 通過 運行時 工作流 用例 pro ext Activiti工作流引擎數據庫表結構 一、數據庫表的命名   Acitiviti數據庫中表的命名都是以ACT_開頭的。第二部分是一個兩個字符用例表的標識。此用例大體與服務API是匹配的。 l

Java Activiti 工作引擎 springmvc SSM 流程審批 後臺框架源碼

Activiti6.0工作流模塊----------------------------------------------------------------------------------------------------------1.模型管理 :web在線流程設計器、預覽流程xml、導出x

Java Activiti 工作引擎 流程審批 後臺框架源碼 springmvc SSM

物流查詢接口 主表 快速 font sql www. 物流 sock hit 博文來源:http://www.fhadmin.org/webnewsdetail1.html工作流模塊----------------------------------------------

Activiti工作引擎學習及流程設計器的安裝(Eclipse外掛)

工作流簡介     我們先來描述一個在工作中經常用到的一個流程:請假     員工張三請假一天 主管王五批准     員工李四請假一天 主管王五不批准  &nbs

ActivitiActiviti工作引擎 - 提交審批和審批處理示例詳解 【精品】

       在上一篇的文章中,我給大家分享了Activiti工作流引擎的API的封裝程式碼,通過我們自己封裝的程式碼,在實際的專案中我們就可以進行工作流相關的開發了。以下內容我們分三個部分:提交審批,審批列表查詢,審批處理。 一、提交審批 &nb

工作引擎JFlow與activiti 對比分析(一)5種基本控制模式的對比

為了更好的說明activiti 與jflow的兩款工作流引擎的特點與區別,我們按照如下幾個方面做一次全面的、客觀的對比。       首先activiti是國外的一款開源的工作流程引擎,在國際上影響比較深遠與廣泛,解決了BPM領域的很多問題,值得我們讚賞。他

馳騁工作引擎JFlow與activiti的對比之4種高階分支同步模式

多重選擇(Multiple Choice) 在流程中,當一個活動完成後,有多個分支進行選擇,可以選擇執行其中的一個或者N個分支。 例子:比如去世博園玩,在門口檢票後,可以選擇A-E個片區中的N個進行觀光。     ACTIVITI 中的支援情況: 1.JPDL方式不支

馳騁工作引擎JFlow與activiti的對比之2種結構化模式

1. 任意迴圈(Arbitrary Cycles) ACTIVITI : 某一個或多個活動可以反覆執行。 例子:使用者買了瓶汽水,拿到汽水後,中了一瓶,又去兌換了一瓶汽水,如果又中了,再去兌換一瓶汽水…. JFLOW: 完全是條件判斷,在表單中增加一個稽核元件,就可以把每次校驗的資訊,寫入裡面,

Activiti教程(二)activiti工作引擎結構講解

快速掌握activiti: 1.下載activiti看下結構  2.部署下activiti-admin 控制檯 3.瞭解流程定義-部署-執行 4.學著使用控制檯 5.開始編碼 一.工作流引擎結構 二.初始化表結構  28張表 比以前的版本多幾張

馳騁工作引擎JFlow與activiti的對比之3種基於狀態的模式

延遲選擇(Deferred Choice) 流程中某個點可以有多個分支進行選擇。不是基於簡單的資料或者決定就可以很明顯地作出選擇,而是會向系統或者執行環境提供多種可選擇的分支;但是又不同於AND-Split模式,延遲選擇只能選擇一個分支執行,一旦選擇了其中第一個分支,那麼其他分支就會被

馳騁工作引擎JFlow與activiti的對比之4種包含多例項的模式

無同步的多例項(MIwithout) 在流程中,一個活動可以啟用多個例項,每個例項相互獨立,並不需要在後面進行同步。 例子:比如使用者購買了N本書,於是後續的支付賬單、更新客戶可以以本書為單位各自執行。 ACTIVITI 中的支援情況: 支援這種模式,但是不允許在後面進行結束動

馳騁工作引擎JFlow與activiti的對比之5種基本控制模式的對比

前言 為了更好的說明activiti 與jflow的兩款工作流引擎的特點與區別,我們按照如下幾個方面做一次全面的、客觀的對比。       首先activiti是國外的一款開源的工作流程引擎,在國際上影響比較深遠與廣泛,解決了BPM領域的很多