jbpm初步


公文类:

package com.wlh.jbpm;
public class Document {

private int id;
private String title;
private String content;
private String creator;
private Long processInstanceId;
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getCreator() {
return creator;
}
public void setCreator(String creator) {
this.creator = creator;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Long getProcessInstanceId() {
return processInstanceId;
}
public void setProcessInstanceId(Long processInstanceId) {
this.processInstanceId = processInstanceId;
}
}

映射文件:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
<class table="T_Document" name="com.wlh.jbpm.Document">
<id name="id">
<generator class="native"/>
</id>
<property name="title"/>
<property name="content"/>
<property name="creator"/>
<property name="processInstanceId"/>
</class>
</hibernate-mapping>


在hibernate.cfg.xml中添加该映射文件
<mapping resource="com/wlh/jbpm/Document.hbm.xml"/>

HibernateUtils工具类:

package com.wlh.jbpm;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {
private static SessionFactory sessionFactory;

static{
Configuration conf = new Configuration().configure();
sessionFactory = conf.buildSessionFactory();
}

public static SessionFactory getSessionFactory(){
return sessionFactory;
}

public static Session getSession(){
return sessionFactory.openSession();
}

public static void closeSession(Session session){
if(session.isOpen()){
session.close();
}
}
}



通过图形界面在src/main/jpdl下创建一个流程定义Process Definition:
[color=red]注意:要在每个任务节点task-node 之间加入task标签(此过程就是给节点分配参与者)[/color]


<?xml version="1.0" encoding="UTF-8"?>

<process-definition
xmlns="" name="jbpm01">
<start-state name="start">
<transition name="" to="张一审批"></transition>
</start-state>
<task-node name="张一审批">
<task>
<assignment actor-id="张一"/>
</task>
<transition name="" to="张二审批"></transition>
</task-node>
<task-node name="张二审批">
<task>
<assignment actor-id="张二"/>
</task>
<transition name="" to="张三审批"></transition>
</task-node>
<task-node name="张三审批">
<task>
<assignment actor-id="张三"/>
</task>
<transition name="" to="end1"></transition>
</task-node>
<end-state name="end1"></end-state>
</process-definition>



使用jbpm的API创建jbpm的相关数据库表:
a.数据库链接配置修改为MySQL的配置:
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://127.0.0.1/jbpm</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">bjsxt</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

b.确保src/main/config下的hibernate.cfg.xml中的数据库配置和当前的数据库对应,
如果没创建数据库,则先创建数据库和url中配置的数据库名称对应:此处为jbpm.


<property name="hibernate.connection.url">jdbc:hsqldb:mem:jbpm</property>

package com.wlh.jbpm;

import org.jbpm.JbpmConfiguration;

import junit.framework.TestCase;

.

// 使用jbpm的API,创建JBPM的数据库表格,也可以使用hibernate.hbm2ddl.auto
public void testCreateTable(){
JbpmConfiguration.getInstance().createSchema();
}

}



部署流程定义:

package com.wlh.jbpm;

import junit.framework.TestCase;

import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.graph.def.ProcessDefinition;


public class Jbpm02_DeployProcessDefinition extends TestCase {

static JbpmConfiguration jbpmConfiguration=JbpmConfiguration.getInstance();

//将流程定义的信息持久化到JBPM数据库表
public void testDeployDefinitionProcess(){
//根据流程定义文件,创建ProcessDefinition对象
ProcessDefinition processDefinition=ProcessDefinition.parseXmlResource("jbpm01/processdefinition.xml");
//context对象类似于hibernate session对象的功能,它封装了hibernate session
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try{
//将流程定义持久化到数据库
jbpmContext.deployProcessDefinition(processDefinition);
}catch(Exception e){
//出现异常后回滚
jbpmContext.setRollbackOnly();
}finally{
jbpmContext.close();
}



}

}

创建一个对应刚刚创建流程定义的流程实例,[color=red]此过程流程实例和公文相互绑定[/color]:

package com.wlh.jbpm;

import junit.framework.TestCase;

import org.hibernate.Session;
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;

public class Jbpm04_CreateProcessInstance extends TestCase {
static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();

public void testCreateProcessInstance(){
JbpmContext context = jbpmConfiguration.createJbpmContext();
try{
context.setSessionFactory(HibernateUtils.getSessionFactory());
//从数据库中加载ProcessDefinition对象
ProcessDefinition processDefinition=context.getGraphSession().findLatestProcessDefinition("jbpm01");
//从流程定义对象中创建流程实例
ProcessInstance processInstance=new ProcessInstance(processDefinition);
//持久化流程实例对象
context.save(processInstance);

Session session=context.getSession();
//流程实例绑定到公文对象
Document doc=(Document) session.load(Document.class, 4);
doc.setProcessInstanceId(processInstance.getId());
//公文对象绑定到流程实例
processInstance.getContextInstance().setVariable("documentId", doc.getId());
processInstance.getContextInstance().setVariable("documentTitle", doc.getTitle());

}catch(Exception e){
context.setRollbackOnly();
}finally{
context.close();
}
}
}


提交公文:

package com.wlh.jbpm;

import junit.framework.TestCase;

import org.hibernate.Session;
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.graph.exe.ProcessInstance;

public class Jbpm05_SubmitDocument extends TestCase {

static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();

//将公文提交到第一个节点
public void testSubmitDocument(){
JbpmContext context = jbpmConfiguration.createJbpmContext();
try{
context.setSessionFactory(HibernateUtils.getSessionFactory());
Document doc=(Document) context.getSession().load(Document.class, 4);
long processInstanceId=doc.getProcessInstanceId();
ProcessInstance instance=context.getProcessInstance(processInstanceId);

//触发流程流向下一个节点
instance.signal();
}catch(Exception e){
e.printStackTrace();
context.setRollbackOnly();
}finally{
context.close();
}

}
}


得到公文在流程中当前所在节点:

package com.wlh.jbpm;

import junit.framework.TestCase;

import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.graph.exe.ProcessInstance;

public class Jbpm06_CurrentNode extends TestCase{

static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
//获得公文当前所处的节点
public void testCurrentNode(){
JbpmContext context = jbpmConfiguration.createJbpmContext();
try{
context.setSessionFactory(HibernateUtils.getSessionFactory());
Document doc = (Document)context.getSession().load(Document.class, 4);
long processInstanceId = doc.getProcessInstanceId();
ProcessInstance instance = context.getProcessInstance(processInstanceId);
System.out.println("当前节点名称="+instance.getRootToken().getNode().getName());
//断言的作用?方便了自动化测试,如果instance.getRootToken().getNode().getName()得到的值不是"张二审批",则会抛出异常;
//this.assertEquals(instance.getRootToken().getNode().getName(),"张二审批" );
}catch(Exception e){
e.printStackTrace();
context.setRollbackOnly();
}finally{
context.close();
}

}
}


查询流动到某个参与者手上的公文列表:

package com.wlh.jbpm;

import java.util.Iterator;
import java.util.List;

import junit.framework.TestCase;

import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.taskmgmt.exe.TaskInstance;

public class Jbpm07_SearchMyTaskList extends TestCase {

static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();

//查询流动到某个参与者手上的公文列表【即待审公文列表】
public void testSearchMyTaskList(){
JbpmContext context = jbpmConfiguration.createJbpmContext();
try{
context.setSessionFactory(HibernateUtils.getSessionFactory());

printTask(context,"张一");
printTask(context,"张二");
printTask(context,"张三");

}catch(Exception e){
e.printStackTrace();
context.setRollbackOnly();
}finally{
context.close();
}
}


private void printTask(JbpmContext context,String actorId){

//得到某个参与者(参与者对应节点)的所有任务实例,任务实例是流程实例流到某个节点(节点对应参与者)而产生的
List taskInstances = context.getTaskMgmtSession().findTaskInstances(actorId);
for (Iterator iter = taskInstances.iterator(); iter.hasNext();) {
TaskInstance taskInstance = (TaskInstance) iter.next();
//得到某个任务实例所在的流程实例,然后从流程实例中拿到变量的信息(对应公文信息,这里拿到的是公文的id和title)
//为什么能拿到公文的信息呢?因为版本Jbpm04_CreateProcessInstance.java中已经将公文绑定到流程实例中了
Integer docId = (Integer)taskInstance.getProcessInstance().getContextInstance().getVariable("documentId");
String title = (String)taskInstance.getProcessInstance().getContextInstance().getVariable("documentTitle");
System.out.println("正在等待【"+actorId+"】审批的公文是:[title="+title+",id="+docId+"]");
}

}
}


触发流程流转到下一个节点:

package com.wlh.jbpm;

import java.util.Iterator;
import java.util.List;

import org.hibernate.Session;
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.taskmgmt.exe.TaskInstance;

import junit.framework.TestCase;

public class Jbpm08_NextNode extends TestCase {

static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();

//触发流程流转到下一个节点
public void testFlowToNextNode(){
JbpmContext context = jbpmConfiguration.createJbpmContext();
try{
context.setSessionFactory(HibernateUtils.getSessionFactory());


nextStep(context,"张二",4);//将张二待审公文流转到下一个节点
}catch(Exception e){
e.printStackTrace();
context.setRollbackOnly();
}finally{
context.close();
}
}


/**
* 将某个参与者手上的某个公文提交到下一个步骤
* @param context
* @param actorId 参与者id
* @param docId 公文id
*/
private void nextStep(JbpmContext context,String actorId,Integer docId){

//得到某个参与者(参与者对应节点)的所有任务实例,任务实例是流程实例流到某个节点(节点对应参与者)而产生的
List taskInstances = context.getTaskMgmtSession().findTaskInstances(actorId);
for (Iterator iter = taskInstances.iterator(); iter.hasNext();) {
TaskInstance taskInstance = (TaskInstance) iter.next();
//
//得到某个任务实例所在的流程实例,然后从流程实例中拿到变量的信息(对应公文信息,这里拿到的是公文的id和title)
//为什么能拿到公文的信息呢?因为版本Jbpm04_CreateProcessInstance.java中已经将公文绑定到流程实例中了
Integer oldDocId = (Integer)taskInstance.getProcessInstance().getContextInstance().getVariable("documentId");
String title = (String)taskInstance.getProcessInstance().getContextInstance().getVariable("documentTitle");
if(oldDocId.equals(docId)){
//参与者的审批任务已经完成,需要结束任务实例
//在默认的情况下,也能够触发流程流向下一个节点
taskInstance.end();//结束任务实例
System.err.println("公文[title="+title+",id="+docId+"]已经被【"+actorId+"】审批完成,已提交到下一个节点");
}
}

}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值