java activiti jbpm_activiti和jbpm工作流引擎哪個比較好?

原標題:activiti和jbpm工作流引擎哪個比較好?

在常用的ERP系統、OA系統的開發中,工作流引擎是一個必不可少的工具。之前在選擇工作流引擎時曾經在activiti和jbpm之間有過比較,當時做出的決定是使用jbpm,但實際開發過程中發現這個選擇是不合適的。目前我們改為選擇Activiti作為工作流模塊的引擎,理由如下:

1、Activiti擁有更簡潔健壯的接口

JBPM自從版本五后,便重啟爐灶,完全拋棄了JBMP4的代碼基礎,重新基于drools進行了實現。JBPM5,JBPM6似乎缺少一個合格的系統架構師,其接口設計匪夷所思,基本上是按照drools的接口再提供了一套JBPM接口,同名的接口,實現類不斷重復出現,代碼體系十分混亂。

一個典型的例子,同樣是查詢待辦事項,在JBPM中接口如下:

List getTasksAssignedAsBusinessAdministrator(String userId, String language);

List getTasksAssignedAsExcludedOwner(String userId, String language);

List getTasksAssignedAsPotentialOwner(String userId, String language);

@Deprecated

List getTasksAssignedAsPotentialOwner(String userId, List groupIds, String language);

@Deprecated

List getTasksAssignedAsPotentialOwner(String userId, List groupIds, String language, int firstResult, int maxResult);

List getTasksAssignedAsRecipient(String userId, String language);

List getTasksAssignedAsTaskInitiator(String userId, String language);

List getTasksAssignedAsTaskStakeholder(String userId, String language);

List getTasksOwned(String userId, String language);

List getTasksOwned(String userId, List status, String language);

上述接口設計者顯然沒有考慮接口的修改擴展需要,將各種復雜的查詢通過一個又一個的方法提供出來,這將導致今后增加一種查詢過濾就必須增加一個getXXX方法,丑陋之至,再看看Activiti的接口:

TaskQuery taskId(String taskId);

TaskQuery taskName(String name);

TaskQuery taskNameLike(String nameLike);

TaskQuery taskDescription(String description);

TaskQuery taskDescriptionLike(String descriptionLike);

TaskQuery taskPriority(Integer priority);

TaskQuery taskMinPriority(Integer minPriority);

TaskQuery taskMaxPriority(Integer maxPriority);

TaskQuery taskAssignee(String assignee);

TaskQuery taskAssigneeLike(String assigneeLike);

TaskQuery taskOwner(String owner);

TaskQuery taskOwnerLike(String ownerLike);

TaskQuery taskUnassigned();

TaskQuery taskUnnassigned();

TaskQuery taskDelegationState(DelegationState delegationState);

TaskQuery taskCandidateUser(String candidateUser);

TaskQuery taskInvolvedUser(String involvedUser);

TaskQuery taskCandidateGroup(String candidateGroup);

TaskQuery taskCandidateGroupIn(List candidateGroups);

TaskQuery processInstanceId(String processInstanceId);

TaskQuery processInstanceBusinessKey(String processInstanceBusinessKey);

TaskQuery processInstanceBusinessKeyLike(String processInstanceBusinessKeyLike);

TaskQuery executionId(String executionId);

TaskQuery taskCreatedOn(Date createTime);

TaskQuery taskCreatedBefore(Date before);

TaskQuery taskCreatedAfter(Date after);

TaskQuery excludeSubtasks();

TaskQuery taskVariableValueGreaterThan(String name, Object value);

TaskQuery processDefinitionName(String processDefinitionName);

TaskQuery withoutDueDate();

TaskQuery suspended();

TaskQuery orderByTaskAssignee();

TaskQuery orderByProcessInstanceId();

TaskQuery orderByDueDate();

long count();

U singleResult();

List list();

List listPage(int firstResult, int maxResults);

}

同樣是查詢待辦事項,Activiti中提供TaskQuery接口,可以設置各種查詢過濾,排序方式,最終通過list方法執行查詢,相比jbpm,它還提供了分頁查詢功能,雙方高下立判。

2、Activiti支持啟動引擎后隨時熱部署

JBPM存在一個軟肋,一個RuntimeService只能在啟動的時候指定bpmn資源,一旦啟動后便不再能夠去更新或者增加bpmn了,這會導致我們系統集成的困難,因為我們自然希望整個系統只有一個工作流引擎實例運行。Activiti則提供了Deploy機制,將bpmn資源的熱部署,熱更新都做了很好的支持

3、Activiti擁有更友好易用的Eclipse編輯插件和在線插件

從下圖就可以看到Activiti在流程編輯上的用心,以及JBPM在流程編輯器上的漫不用心:

4、Activiti依賴更少的jar包

Activiti依賴的第三方jar包較少,主要就是mybatics,而JBPM則依賴了一大堆的jar,從drools到繁雜的hibernate,再到自身拆分的零零散散的jar包,讓人不由覺得它是一個龐大的怪物。

5、Activiti擁有更友好的用戶體驗

雖然JBPM和activiti都是使用bpmn格式作為流程定義語言,但二者都相應地利用了bpmn格式的規范擴展了一些自定義的功能,根據這些擴展它們都提供了自己的綁定表單的方式。JBPM核心引擎完全沒有關于表單的任何抽象,它的工作機制是通過全局常量,流程變量,任務變量,這些概念十分技術化。

相比之下Activiti則更貼近實際的應用場景,它將為開始節點,以及人工任務提供了表單設置,用戶可以設置字段名稱,字段類型。通過Activiti的平臺可以根據這些設置去生成表單,但如果不使用其平臺只使用引擎的話,也支持通過它來表達與第三方表單的關系。這些表單設置的元數據信息也可以通過接口去獲取。

總結:

JBPM5,JBPM6使用drools規則引擎來實現工作流引擎聽起來是一個很酷的概念,但JBPM開發團隊顯然沒有很好地去掌控好整個架構的變化。因此選擇activiti作為工作流引擎至少在可見的幾年間都是正道,今后需要實現規則庫時,再單獨引入drools工具包,相信drools會是一個比JBPM靠譜的工具。

1a579412681a65a16f9452b41aa059a4.png

如果JAVA底子差一點的話可以用XJR快速開發框架,采用主流的Activiti工作流引擎,遵循bpmn規范,可實現XML、Json一鍵導入導出,以及添加了人員動態選擇、便捷式會簽設置、便捷式任務委托設置、添加自定義表單、自定義節點按鈕、動態變量選擇(包括會簽變量、按鈕變量、表單變量)以及各節點屬性優化,遵循以使用者為中心的優化原則,將整個流程的操作變得簡單、快捷,實現0基礎短時間可自由編輯流程模板。返回搜狐,查看更多

責任編輯:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/275751.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/275751.shtml
英文地址,請注明出處:http://en.pswp.cn/news/275751.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C/C++中善用大括號

C/C中善用大括號轉載于:https://www.cnblogs.com/satng/archive/2010/12/17/2138840.html

識別人聲_演唱人聲的5個技巧

識別人聲什么是聲樂伴奏? (What is Vocal Comping?) Vocal comping describes the process of combining multiple vocal takes into one “supertake” that has the best parts of each. This is called a “composite track,” or comp for short. Many instrum…

你知道source map如何幫你定位源碼么?

大家好,我是若川。今天分享一篇我們經常會忽略的定位原始代碼位置原理的文章。文章不長,例子不錯,可以先收藏,有空時動手試試。學習源碼系列、年度總結、JS基礎系列前言我們知道,代碼上線前要經過壓縮,美化…

OOP 中的 方法調用、接口、鴨式辯型、訪問者模式

2019獨角獸企業重金招聘Python工程師標準>>> 方法調用的四種方式 直接調用:通過類或者實例直接調用其方法。接口調用或者轉型調用:通過將實例回調給一個接口對象,或者轉型為一個父類的實例,來調用間接調用:…

Substitution控件MethodName無法取到Session的解決辦法

Substitution是對緩存頁面實現動態顯示部分內容的控件,使用方法:在后臺頁面添加靜態方法,private static string MethodName(HttpContext context),經典的用法是動態顯示的是當前的登錄用戶名字(非登錄用戶顯示其他的)…

java中想要保留2位小數_java使double保留兩位小數的多方法 java保留兩位小數

mport java.text.DecimalFormat;DecimalFormat df new DecimalFormat("######0.00");double d1 3.23456double d2 0.0;double d3 2.0;df.format(d1);df.format(d2);df.format(d3);3個結果分別為:3.230.002.00java保留兩位小數問題:方式一&#x…

游戲 新手引導 設計_我認為每個新手設計師都應該知道什么

游戲 新手引導 設計重點 (Top highlight)I should probably have titled this article “What I wish I knew as a newbie designer.” Anyway, I’ve been doing this graphic design thing for a little over a year now, and I know now, a few things that could have made…

畢業年限不長的前端焦慮和突破方法

大家好,我是若川。今天周六,分享一篇相對輕松的文章。經作者耳東蝸牛 授權轉載鏈接:https://juejin.cn/post/6968002742321152014也可點擊文末閱讀原文直達本篇文章來源于:周五和團隊成員[20年畢業]的一次閑聊。畢業不到一年&…

開源自然語言處理工具包hanlp中CRF分詞實現詳解

CRF簡介 CRF是序列標注場景中常用的模型,比HMM能利用更多的特征,比MEMM更能抵抗標記偏置的問題。 [gerative-discriminative.png] CRF訓練 這類耗時的任務,還是交給了用C實現的CRF。關于CRF輸出的CRF模型,請參考《CRF模型格式說明…

java 素數歐拉篩選_[C++]歐拉素數篩的理解與實現

在傳統的素數篩法中,我們使用了對于每一個數n,在 1~(√n) 范圍內進行取模檢查,這樣逐一判斷的復雜度為n(√n)。但如果我們需要更快的篩法時怎么辦?于是著名的歐拉篩誕生了。它能將復雜度降為**O(n)**級別。1.關鍵理解:…

交互規則_您必須永不中斷的10條交互設計規則

交互規則重點 (Top highlight)In life, there are certain rules you must never break. If you do there will be hell to pay. In User Interface design there are also rules to live by. They are called “heuristics” or general principles that improve usability in…

一個幫助我100%拿offer的面試學習法

大家好,我是若川。今天周日,再分享一篇相對輕松的文章。文中說的面試學習法有一定的借鑒意義。另外我也推薦大家每隔一段時間不為跳槽的更新自己簡歷,也是對自己一階段的梳理總結,畢竟功在平時。哈嘍大家好,我是大圣&a…

2010年終總結

還有兩天2010就要結束了,寫下自己的年終總結吧,以總結自己,展望明年。2010對我來說是怎樣的一年呢?忙碌的一年,鴨梨更大的一年,折騰的一年,復雜的一年,夢游的一年,痛并快…

java獲取apk啟動activity_兼容 Android 10 啟動 APK 實現方案

背景我們想啟動 APK 程序,有很多種方法,可以使用 Intent,也可以使用 adb shell 命令來啟動,還有通過反射來啟動 APk 程序。我們這里主要討論通過反射的方式來啟動 apk 程序。Android10 之前,我們通過反射來啟動 APK&am…

Android Studio中解決jar包重復依賴導致的代碼編譯錯誤

在原本的代碼中已經使用了OKHTTP和rxjava,然后今天依賴retrofit的時候一直報錯 Program type already present: okhttp3.internal.ws.RealWebSocket$1.class 說是我重復添加了OKHTTP的包,但其實我直接把OKHTTP的依賴注釋掉都沒用,只要依賴ret…

面試被問項目經驗不用慌,按這個步驟回答絕對驚艷

大家好,我是若川。常有小伙伴問,面試時項目經驗怎么回答,經常會分享這篇文章給TA。本文經授權轉載。面試、學習源碼系列、年度總結、JS基礎系列前言本篇文章的作者是來自阿里淘系用戶增長前端團隊的“亦遜”,18年作為雙非本科生通…

使用概念模型 和心智模型的_為什么要使用模型?

使用概念模型 和心智模型的In a former life, I studied critical feminist theory. This included the field of Semiotics — the study of signs and the production of meaning, as well as Deconstruction —the unpacking of meaning to question assumptions.在過去的生…

長效密鑰與臨時密鑰JAVA判斷_MSBuild無法使用臨時密鑰簽署ClickOnce清單(錯誤MSB3326和MSB3321)...

我正在嘗試在Windows Server計算機上構建ClickOnce Windows Forms項目(.NET 3.5 / Visual Studio 2010) . (為了使用Hudson CI自動化構建過程 . )為了對ClickOnce清單進行簽名,我在Visual Studio中創建了一個臨時密鑰 temp.pfx . 我可以在我的工作站上從Visual Stud…

URL some

** 路由系統:URL配置(URLconf)就像Django所支撐網站的目錄. 本質是URL與該URL要調用的函數的映射表 基本格式 : from django.conf.urls import url urlpatterns [url(正則表達式,views視圖,參數,別名) ] 參數 -- 傳給函數視圖的默認參數 (字典形式) 別名 -- 一個可選的name參…

什么?在 VSCode 里也能用 Postman了?

大家好,我是若川。VSCode中有很多好用的插件,今天推薦 Postcode。面試、學習源碼系列、年度總結、JS基礎系列以前一直在用postman做API測試,如果你同時在使用vscode開發時,每次切出去可能比較煩,其實就是太懶了。。。作…