最近维护一个项目,由于项目比较老了,所以用的jbpm3.2,自学了下:
1、创建jbpm数据库表:
JbpmConfiguration.getInstance().createSchema();
·2、部署流程(即把流程定义对象持久化到数据库中):
首先,创建JbpmConfiguration和JbpmContext对象,其中JbpmContext对象可以拿到是hibernate session的封装,提供了对jbpm对象的持久化操作。
JbpmConfiguration cf = JbpmConfiguration.getInstance();
JbpmContext context = cf.createJbpmContext();
ProcessDefinition pd = ProcessDefinition.parseXmlResource("test/prcessDefinition.xml");
try{
context.deployProcessDefinition(pd);
}catch(Exception e){
context.setRollbackOnly();
}finally{
context.close();
}
部署完成后,流程中的节点信息及任务信息以及transition都被啊到数据库
3、创建流程实例:
Document doc = new Document();
doc.setName("123");
context.getSession().save(doc);
//1、从数据库加载ProcessDefinition对象
ProcessDefinition pd = context.getGraphSession().findLatestProcessDefinition("test");
//2、根据ProcessDefinition,创建流程实例
ProcessInstance pi = new ProcessDefinition(pd);
context.save(pi);
//3、创建流程实例变量
pi.getContextInstance().setVariable("doc",doc.getId());
4、将流程提交到第一个环节
pi.signal();
5、查询当前所处的环节
pi.getRootToken().getNode().getName();
6、任务分配
当流程进入一个任务节点,JBPM根据任务节点所定义的任务分配规则,创建TaskInstance对象,
并且建立TaskInstance对象和ProcessInstance对象之间的联系,设置 TaskInstance对象的actorId属性的值,这称为任务分配。
/*
*底层sql:select ti from TaskInstance as ti where ti.actorId=:actorId
* and ti.isSuspended !=true and ti.isOpen=true;
*/
List tasks = context.getTaskMgmtSession().findTaskInstance(actorId);
for(Iterator iter = tasks.iterator();iter.hasNext();){
TaskInstance ti = (TaskInstance )iter.next();
}
7、通过TaskInstance流转到下一个节点
List tasks = context.getTaskMgmtSession().findTaskInstance(actorId);
for(Iterator iter = tasks.iterator();iter.hasNext();){
TaskInstance ti = (TaskInstance )iter.next();
ProcessInstance pi = ti.getProcessInstance();
Integer docId = pi.getContextInstance().getVariable("docId");
if(docId.equals(documentId)){
//在缺省情况下,调用end方法有两个目的,1:结束TaskInstance 对象
//2、触发当前token对象的signal方法,使得流程继续向下流转
ti.end();
}
}