JBPM6與之前的版本不同之處主要是控制台的功能更加強大了,使得6.0幾乎可以涵蓋BPM業務層面的內容,當然了,需要專業人士來使用,不適合普通的非技術型的admin來操作。先講一講JBPM6的大致結構吧。這裡我用到13年11月21號的final版。
A.容器,JBPM6原生的容器使用jboss GA,當然了jboss非常強大,提供非常多的可用模塊,但是對於想要一直jbpm6的同學,則成為了負擔。特別是JBPM6.0使用的JAAS&JAAC的模式與jboss綁定的太緊,移植起來非常痛苦,後面我會專門講講jbpm6.0到jetty上的遷移過程。
B.數據庫,原生數據庫為H2,配置到mysql等關系型數據庫也很容易,不同的容器下有不同的配置規則。數據庫是即時生成的,很方便。CRUD的定義分散在好幾個包中,參看persistence.xml。
C.事務管理器,Bitronix Transaction Manager,接觸JBPM6.0以前,我不認識它,通過查資料,才知道,這是個老家伙,很老很老。web-info中的bean.xml有個BTM開頭的標簽,實際作用是把容器中的BTM引入到APP的scope中。
D.WELD.1.x,bean管理工具,字節碼增強,調試源碼的時候很痛苦,各模塊的組織結構都全靠它來管理,很重要。
E.DROOLS,規則引擎,耦合到JBPM core中,控制流程實例狀態變化過程中的令牌跳轉。
F.Gunvor,客戶代碼管理工具,我們可以在jbpm6.0中創建工程,在工程中創建流程,表單等等,與工程相關的所有文件都有這位大哥管理,幫你build成可以deploy的package。
G.KIE,kie打頭的包,是JBPM6.0中各種編輯器的源代碼,對我來說,木有什麼研究的必要。
H.Uberfire,我認為是與VFS相關的模塊。JBPM6.0的客戶代碼存放在VFS中,當你啟動server以後你會發現在bin的根目錄下出現兩個.開頭的文件夾,裡面有許多的小文件。就是和這相關的了,最近我正在做相應的擴展,使得客戶代碼可以導入導出。(jbpm6的缺點之一,當兩個人在各自的機器上建好工程之後,沒有辦法把這兩個工程完全的合並到一起)。
I,FORM DESIGNER,這是我見過最弱智的designer,正在替換中。
J,Process designer,流程設計器源於11年intalio開源的wapama項目(已死),沒想到jboss拿去大刀闊斧的改得面目全非,還冒出來許多bug。原本wapama的模型是json的,對utf8支持的很好,現在jboss拿回去轉成它自己的xml(大概是不想別人拿去用吧,比較,json對象誰都可以用),bug冒一堆。
有幸參與過Intalio的開發,逐漸修復process Designer的問題。I18N也做好了。可惜的是整個js代碼被jboss合了,想再拆開來讓其他bpm引擎或者ESB引擎使用就費勁了,所以決定重新寫一個designer,還好designer的開發流程我還記得,希望在年底可以出來個初稿。
K,JAAC,為什麼單獨拿出來說?JBOSS GA對這個是支持的。如果想一直到tomcat上,需要寫一個VALVE的組件,才能使得jbpm6控制開打開無誤,這是github上現成的。根據這個,並做一些適當的workaround,我在移植到jetty的時候,通過在web.xml中添加一個filter完成了JAAC的支持,雖然看著很惡心,threadlocal,但是好歹,能用了不是。
PS:試著把帶有jbpm6的jetty移植到karaf中去,沒有直接成功。包依賴太多,jetty版本不太匹配,JAAC沒找到合適的解決辦法。又workaround,通過創建一個container的bundle,動態創建一個loader加載整個jetty,再創建一個bridge的bundle,為jetty和karaf搭個橋,勉強使得karaf和jbpm工作在一個jvm裡面。當然中間遇到很多困難,比如兩者的JNDI factory的沖突等等。以後慢慢講。Date :14/05/14
BTM:
先看看jbpm6.0移植到jetty之後,與BTM相關的配置吧。
in jetty.xml
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 聲明數據源,
<New id="jbpm" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg>jdbc/jbpm</Arg>
<Arg>
<New class="bitronix.tm.resource.jdbc.PoolingDataSource">
<Set name="className">bitronix.tm.resource.jdbc.lrc.LrcXADataSource</Set>
<Set name="uniqueName">jdbc/jbpm</Set>
<Set name="minPoolSize">0</Set>
<Set name="maxPoolSize">5</Set>
<Set name="allowLocalTransactions">true</Set>
<Get name="driverProperties">
<Put name="driverClassName">com.mysql.jdbc.Driver</Put>
<Put name="url">jdbc:mysql://localhost:3306/jbpm</Put>
<Put name="user">marshal</Put>
<Put name="password">marshal</Put>
</Get>
<Call name="init" />
</New>
</Arg>
</New>
// 創建transaction
<New class="org.eclipse.jetty.plus.jndi.Transaction"> <Arg>
<Call name="getTransactionManager" class="bitronix.tm.TransactionManagerServices" />
</Arg>
</New>
//其他配置
<Call name="getConfiguration" class="bitronix.tm.TransactionManagerServices">
<Set name="serverId">jetty-btm-node0</Set>
<Set name="logPart1Filename"><SystemProperty name="jetty.home" default="." />/btm1.tlog</Set>
<Set name="logPart2Filename"><SystemProperty name="jetty.home" default="." />/btm2.tlog</Set>
</Call>
<Call name="addLifeCycle">
<Arg>
<New class="bitronix.tm.integration.jetty7.BTMLifeCycle"/>
</Arg>
</Call>
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
webapp下web-inf中的bean.xml
////////////////////////////////////////////////////
<m:CMTBTMTransaction>
<s:modifies />
</m:CMTBTMTransaction>
<m:BTMTransactionManagerSynchronizations>
<s:modifies />
</m:BTMTransactionManagerSynchronizations>
////////////////////////////////////////////////////
web.xml
/////////////////////////////////////////////////////////////////
<resource-env-ref>
<resource-env-ref-name>jdbc/jbpm</resource-env-ref-name>
<resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>
</resource-env-ref>
/////////////////////////////////////////////////////////////////
2014,5,23
昨天有人向我詢問如何輸出process instance 狀態圖。目前jbpm6.0console界面與整個後台通信使用GWT技術,導致每個界面與console綁定非常緊,但是我們使用jbpm6的時候往往希望把表單輸出和狀態圖輸出拿到自己的應用中去。這裡我講講自己在實現過程中的心得體會。
流程狀態圖:
status
顯示該狀態圖的方式與jbpm6原生的狀態圖類似,利用了流程設計器只讀時的展示功能,把對應的流程定義json文件經過加工(修改配色),顯示到浏覽器上。
步驟如下:
1,界面上include三個關鍵的js文件
js/conpressed/designer-core.js
js/conpressed/designer-plugins.js
js/conpressed/designer-utils.js
2,生成需要的json in java
ProcessSummary ps = _dataServiceEntryPoint.getProcessById(pis.getDeploymentId(), pis.getProcessId());
String bpmn2in = new String(Base64.decodeBase64(ps.getEncodedProcessSource()), "UTF-8");
Definitions def = ((JbpmProfileImpl) profile).getDefinitions(bpmn2in);
JBPMBpmn2ResourceImpl bpmn2resource = (JBPMBpmn2ResourceImpl) rSet.createResource(URI.createURI("virtual.bpmn2"));
bpmn2resource.getContents().add(def);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
bpmn2resource.save(outputStream, new HashMap<Object, Object>());
String revisedXmlModel = outputStream.toString();
revisedXmlModel = revisedXmlModel.replace("utf-8-start-chars", "&#");
String jsonStr = profile.createUnmarshaller().parseModel(revisedXmlModel, profile, "ReadOnlyService");
3,界面上js代碼
editor_parameters=source.evalJSON();
ORYX.EDITOR = new ORYX.Editor(editor_parameters);
完成對json的顯示。
JBPM4.4部署在Tomcat6以上的版本jar包沖突 http://www.linuxidc.com/Linux/2014-04/99476.htm
JBPM工作流開發指南 PDF http://www.linuxidc.com/Linux/2014-06/103823.htm
JBPM流程實例(PV)Process Variables http://www.linuxidc.com/Linux/2014-06/102859.htm
JBPM流程實例(PI)Process Instance http://www.linuxidc.com/Linux/2014-06/102858.htm
JBPM流程部署校驗 http://www.linuxidc.com/Linux/2014-06/102860.htm
JBPM 的詳細介紹:請點這裡
JBPM 的下載地址:請點這裡