论坛首页 Java企业应用论坛

jBPM的学习(一)

浏览 3187 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-02-01  
随着SOA的发展BPM渐渐成为人民关注的部分。
其实很多东西早已存在,只是大家忽视它的存在而已。BPM就是这样,其实有程序出现的时候,BPM就已经出现了,只是没有名字而已。
关于BPM,许多独立的厂商给出了不少的误导:
1)BPM系统可以实现无需维护代码,甚至有些厂商鼓吹无需写一行代码就能,只需要画画图就能完成工作。
2)BPM能和系统分开,我觉得适度松耦合是可以做到的,但是完全和业务代码分开是不现实的。否则BPM也不是嵌入式的了。

在目前BPM的市场上出现了诸侯割据的场面,各大厂商都维护着自己的一套标准。开源方面出现了两大阵营SHARK和jBPM,然而我选择了后者,主要原因是jBPM是JBOSS家庭成员,JBOSS家庭已渐渐成为了标准和规范的代名词。另外jBPM也有一个很好的Eclipse插件。

说完废话开始学习
jBPM由核心组件,web控制台,调度组件,身份组件,BPEL扩展组件几大组件组成,核心组件是由纯JAVA编写,所以能很好的和J2SE程序,JAVAEE程序结合。jBPM的持久层采用符合JPA标准的Hibernate框架,身份组件用于管理用户,当对于大部分程序,希望自己维护用户的管理,你大可用自己的身份管理程序。

主要涉及以下几个概念
process definition(流程定义):工作流的流程的完整定义,包括节点和节点之间的走向等关键信息。通常以xml格式提供。一个具体的系统往往是由许多个流程组成的。

process instance(流程实例):每个process defination生成的业务层的实例。当process instance创建以后,代表流程的执行路径,并被定义到开始节点。

token(令牌):表示了一个执行的路径,它是运行时产生的。当实例建立以后,令牌也就产生了。

node:表示流程中的一个节点。

transition:关联两个节点,用于表示节点的走向

signal:让一个token执行下一步。process instance也有signal,当用process instance的signal时,其实就是运行process instance根令牌(root token)的signal

当token进入到一个node时,node会被执行,并产生一些事件,比如进入、离开节点等,这也是执行业务逻辑的地方。事件由action来表示。

下面介绍一下流程的定义和持久
//解析一个xml为一个ProcessDefinition对象
ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(...);
//打开session
JbpmSession jbpmSession = jbpmSessionFactory.openJbpmSession();
//开启事务
jbpmSession.beginTransaction();
//持久化流程定义到数据库
jbpmSession.getGraphSession().saveProcessDefinition(processDefinition);
//提交事务
jbpmSession.commitTransaction();
//关闭session
jbpmSession.close();

这样,一个流程就被持久化到数据库,可以看到有hibernate的影子。当你需要使用这个流程时:
JbpmSession jbpmSession = jbpmSessionFactory.openJbpmSession();
jbpmSession.beginTransaction();
//找到刚刚那个流程,processname是流程的名字,在XML文件中定义,findLatestProcessDefinition方法是找到该流程的最新版本,jBPM允许多个流程同样的名字,以版本号区别
ProcessDefinition processDefinition = jbpmSession.getGraphSession()
.findLatestProcessDefinition(processname);
//创建该流程的实例
ProcessInstance processInstance = new ProcessInstance(processDefinition);
//得到实例上下文,上下文用来保存一些属性信息,比如审核流程中的,审核人、审核信息等
ContextInstance contextInstance = 
processInstance.getContextInstance();
//上下文添加属性,这些信息将和上下文绑在一起
contextInstance.setVariable(varName,varValue);
//得到令牌
Token token = processInstance.getRootToken();
/**
操作令牌
//token.signal();
**/
//保存实例
jbpmSession.getGraphSession().saveProcessInstance(processInstance);
jbpmSession.commitTransaction();
jbpmSession.close();
当需要再次操作这个实例的时候,只需要把
ProcessInstance processInstance = new ProcessInstance(processDefinition);
改成
List processInstances = 
graphSession.findProcessInstances(...);

论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics