從JBPM3到JBMP4

JBPM是一個優秀的開源工作流框架,核心引擎算法源自PetriNet理論,並深度了集成了Hibernate作爲引擎的持久框架。 

2006年底,我開始關注JBPM,並準備作實際應用,但是當時關於JBPM的中文資料比較少,於是打算翻譯JBPM官方的user guide,翻譯初稿在07年上半年完成,對應的版本是V3.1.2,打算在年底利用假期完善後發出來。不過JBPM後來發佈了3.2版,其文檔也做了相應更新,增加了一些章節,後來工作較忙,沒有繼續翻譯,於是也就一直沒有發佈。

後續JBPM又發佈了3.3版,不過文檔並沒有更新,仍然採用3.2.3的版本,雖然小版本變化不大,但是這樣的做法還是不值得提倡。可以說,,缺少優秀、全面的文檔,一直是包括JBPM在內的,不少開源框架的通病;而像Spring、Hibernate這樣框架能夠成爲主流,跟豐富的配套文檔、教程、以及市售的鋪天蓋地的書籍是分不開的。雖然JBPM應用廣泛,但文檔太少、市場上相關書籍缺失,是限制其繼續向前發展的一個不小的障礙。在翻譯 JBPM文檔的同時,我也對其源代碼進行了分析,其中就發現有一些功能,代碼裏已經實現,但文檔中卻並未提及。

2009年7月,JBPM正式發佈了的4.0,與3.X相比,整個項目幾乎重寫:新的流程定義語言、新的引擎實現、新穎的PVM概念、新的配置方式、全新的開發接口、全新的數據庫結構。。。。。。放眼看去,幾乎JBPM4與JBPM3壓根就沒什麼關係。另外,文檔方面似乎也終於得到了更大的支持,新的官方文檔分成了兩部分:userguide和devguide,前者關注如何直接上手、接口使用以及流程開發,後者關注對整個架構的設計、更高級複雜的擴展開發。

在8月發佈的最新4.1版的devguide裏,說到了開發JBPM4的兩個目標: 

1、 改進可支持性:通過持續集成,對所支持的產品環境、配置提供更好、更長期的支持保證。 

2、 降低門檻,提升應用率:區分公共基礎型應用和高級定製化應用兩種應用模式,讓前者上手更快,後者也能減少開發難度。 

其實,如果從這兩個目的出發,可以發現,JBPM4的變化的確是遵從了這兩點,而且進一步深入的分析可以得出這樣的結論:儘管整個項目幾乎重寫,但JBPM的核心機制沒有變,即本質未變。下面是devguide中列出的JBPM3與JBPM4的一些變更對照表。

        通用名稱的變化 




從這些變更表中,再結合新的JBPM4.1發佈包的內容,可以發現,從JBPM3到JBPM4,真正的變化僅僅是: 

1、 流程定義語言的模型沒有改變,只是部分元素的命名發生變化 

2、 流程執行引擎的算法沒有改變,只是對原有引擎進行了優化,去掉了冗餘的root token。JBPM4出來後,包括在JavaEye裏,有不少的文檔探討了JBPM引擎的變化,有的文章分析說其核心引擎的調度機制完全不同了,這是不對的,因爲還是Token機制,只是換了個名字(Execution),加上一定的優化(或稱簡化)。

3、 流程引擎的事件機制沒有改變,只是改變了默認的事件觸發範圍 

4、 整個數據庫結構完全改變,甚至前綴變成了JBPM4,目的是希望能夠跟JBPM3的表不發生衝突,甚至能夠兩個版本並行運行。其實數據庫結構的巨大變化,是第2點變化、以及其他冗餘消除的自然結果

5、 接口的變化,文檔的調整和重寫,只是爲了更好的針對公共普通型應用和高級定製型應用,降低二者的開發難度。 

這裏提到的第2點和第4點,我有深刻的體會,因爲在當時應用JBPM3的過程中,在分析JBPM3引擎的時候,也逐漸意識到其引擎存在的幾個類似問題: 

1、 root token其實是冗餘,完全可以合併到流程實例裏 

2、 module instance 也是冗餘的 

3、 流程定義相關的表也是冗餘的 

4、 沒有歷史表 

5、 。。。 

於是從08年底到09年初,參考JBPM3和PetriNet原理,自己實現了一套新的工作流引擎,它就像一個消除了各種冗餘、並增加了歷史表等功能的JBPM3。在消除冗餘後,除掉增加的歷史表,數據庫結構上比JBPM3的運行表數量減少了一半。在JBPM4發佈後,我驚奇的發現,JBPM4的改動方向,跟我的方式非常相似:合併了root token和流程實例、去掉了流程定義相關表、增加了一些歷史表等等。除掉歷史表和集成的用戶表,JBPM4的運行表數量也只有JBPM3的一半左右。可謂之殊途同歸,不過雖然設計思路上類似,但實現方式還是有很大不同,因此也不能算是簡單的“重複建設”或僅僅是一個“新的輪子”。對於自己實現的這個東西,希望以後進一步成熟後,有機會能夠拿出來。

雖然JBPM4延續了JBPM3的內在,但是畢竟是一個從新設計並實現的新框架,而且JBPM4中還承載了一個更新的思想:流程虛擬機(PVM)。JBPM4雖然已經發布了兩個版本4.0和4.1,但是個人認爲其依然還不太成熟。而目前還存在大量的JBPM3應用,由於JBPM4對3完全不兼容,因此遷移的成本很高,跟重新開發沒什麼差別,所以我相信JBPM3的還會有持續使用,所以我想之前翻譯的JBPM3文檔應該還是有用的,或許現在已經有了一些翻譯版本存在,不過沒關係,只要是有用的文檔,應該越多越好。如果有時間,希望能夠繼續翻譯下JBPM4的devguide,更能多寫一點實際應用的體會,以及其他任何能夠有用的文章(說實在話,翻譯水平還是有限,很多時候只能生硬的直譯)。

時間,永恆之矢。技術的發展,有如奔流不息的江濤。但是總有些藏在背後的本質,引起變化的原因,推動發展的規律等等,那些我們未顯見的,但卻有意義的東西,是相對恆定的,要我們去把握。我們不能只盲目的求新、求變,而要看到,每一天,在太陽升起的時刻,這個世界,99%跟已經過去的一天相比,是幾乎完全一樣的。而持續引起和支配世界那1%變化的各種定律,從來就沒有改變過。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章