最近维护一个项目,由于项目比较老了,所以用的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(); } }