歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

JBPM 6.0 Final使用心得筆記

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 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved