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包冲突

JBPM工作流开发指南 PDF

JBPM流程实例(PV)Process Variables

JBPM流程实例(PI)Process Instance

JBPM流程部署校验

JBPM 的详细介绍:请点这里
JBPM 的下载地址:请点这里

本文永久更新链接地址:

相关内容