作者:littlelove 来源:LiveSpace 酷勤网收集 2007-08-29
jBMP3.0的文档在我看来有点简单,
把文档从头看完,还是有点无从下手的感觉,
带的几个例子也相对简单,
先把涉及的相关概念,按自己的理解整理一下。
也是学习hibernate的使用的好项目。
jBMP主要涉及到以下概念:
process definition:工作流的流程的完整定义,包括节点和节点之间的走向等关键信息。通常以xml格式提供。
process instance:是基于process defination而生成的业务层的实例。当process instancep创建以后,一个token就产生,代表流程的执行路径,并被定义到开始节点。
token:表示了一个执行的路径,它是运行时产生的。
node:表示流程中的一个节点。
signal:让一个token执行下一步。
当token进入到一个node时,node会被执行,并产生一些事件,比如进入、离开节点等,这也是执行业务逻辑的地方。事件由action来表示。
再把自己做的一个简单的例子贴上来:
- process-definition文件
<process-definition name='Decl Definition2'>
<start-state name='start'>
<transition to='ComposeBatchValidate' />
</start-state>
<state name='ComposeBatchValidate'>
<event type='node-enter'>
<action class='org.jbpm.tutorial.DeclComposeBatchAction' />
</event>
<transition to='FirstAudit' />
</state>
<state name='FirstAudit'>
<transition to='end' />
</state>
<end-state name='end' />
</process-definition>
- 将process-definition文件持久化到数据库
InputStream is = DeclBatchTest.class
.getResourceAsStream("DeclBillStats.xml");
ProcessDefinition processDefinition = ProcessDefinition
.parseXmlInputStream(is);
JbpmSession jbpmSession = jbpmSessionFactory.openJbpmSession();
jbpmSession.beginTransaction();
jbpmSession.getGraphSession().saveProcessDefinition(processDefinition);
jbpmSession.commitTransaction();
jbpmSession.close();
- 生成一个新的process instance
JbpmSession jbpmSession = jbpmSessionFactory.openJbpmSession();
jbpmSession.beginTransaction();
ProcessDefinition processDefinition = jbpmSession.getGraphSession()
.findLatestProcessDefinition("Decl Definition2");
ProcessInstance processInstance = new ProcessInstance(processDefinition);
ContextInstance contextInstance =
processInstance.getContextInstance();
contextInstance.setVariable("no","1234");
Token token = processInstance.getRootToken();
//System.out.println(token.getNode().getName());
//token.signal();
//System.out.println(token.getNode().getName());
//token.signal();
//System.out.println(token.getNode().getName());
jbpmSession.getGraphSession().saveProcessInstance(processInstance);
jbpmSession.commitTransaction();
jbpmSession.close();
注意:其中的Context,是流程控制和业务逻辑层交换数据的方式。要交换的信息,可以保存在ContextInstance中,并在以后读取此process instance时,及Action的实现类中得到这些信息。
- 读取已有的process instance
JbpmSession jbpmSession = jbpmSessionFactory.openJbpmSession();
jbpmSession.beginTransaction();
GraphSession graphSession = jbpmSession.getGraphSession();
ProcessDefinition processDefinition =
graphSession.findLatestProcessDefinition("Decl Definition2");
List processInstances =
graphSession.findProcessInstances(processDefinition.getId());
System.out.println(processInstances.size());
for(int i=0;i<processInstances.size();i++){
ProcessInstance processInstance =
(ProcessInstance) processInstances.get(i);
Token token=processInstance.getRootToken();
token.signal();
System.out.println(token.getNode().getName());
ContextInstance contextInstance =
processInstance.getContextInstance();
System.out.println(contextInstance.getVariable("no"));
jbpmSession.getGraphSession().saveProcessInstance(processInstance);
}
jbpmSession.commitTransaction();
jbpmSession.close();
- action的实现类
action要继承ActionHandler,并提供execute方法。如:
public void execute(ExecutionContext executionContext) {
System.out.println("come in");
System.out.println(executionContext.getContextInstance().getVariable("no"));
}

