seam与jbpm工作流实现了无缝整合,在基于seam来开发具有工作流的功能时,只需简单的将hibernate.cfg.xml和jbpm.cfg.xml的文件配置一下,在WAR的components.xml声明使用流程定义的jpdl流程定义文件就实现了系统的整合。工作流的核心工作分为二个部分,一为流程的定义,二为流程实例与业务数据实例绑定。之后以不同的角色实现流程的流转即可。
本例的流程定义十分简单,共五个节点,为开始节点,结束节点和三个不同角色的节点的流程。页面的导航在page.xml是配置,各节点的任务开始和结束使用注解式声明,页面的任务列表使用seam提供的单用户。集合表达式和JSF标签来完成用户交互操作。
1 流程定义文件,此流程定义会持久化到对应的数据表内。
2 对登陆类进行指定jbpm用户
3 用户逻辑实现类,用户页面跳转、流程开始、节点流转等。
4 定义业务实体
5 页面交互页面。
代码如下:
1 processdefinition.xml流程定义文件
<?xml version="1.0" encoding="UTF-8"?>
<process-definition name="文档测试流程">
<start-state name="开始">
<transition name="提交张三审批" to="张三审批"></transition>
</start-state>
<task-node name="张三审批">
<task name="审批1">
<assignment actor-id="#{actor.id}"/>
</task>
<transition name="提交李四审批" to="李四审批"></transition>
</task-node>
<task-node name="李四审批">
<task name="审批2">
<assignment actor-id="#{actor.id}"/>
</task>
<transition name="提交王五审批" to="王五审批"></transition>
</task-node>
<task-node name="王五审批">
<task name="审批3">
<assignment actor-id="#{actor.id}"/>
</task>
<transition name="结束流程" to="结束"></transition>
</task-node>
<end-state name="结束"></end-state>
</process-definition>
2 对登陆类进行指定jbpm用户
@In(create=true) Actor actor;
actor.setId(user.getUsername());
3 用户逻辑实现类,用户页面跳转、流程开始、节点流转等
/*******************************************************************************
* 文件名:WorkFlowAction.java<br>
* 版本: <br>
* 描述: <br>
* 版权所有: <br>
* <br>
* 创建者: 沙振中 <br>
* 创建日期: May 12, 2009 <br>
* 修改者: <br>
* 修改日期: <br>
* 修改说明: <br>
******************************************************************************/
package org.shaneseam.action;
import javax.annotation.Resource;
import javax.ejb.Remove;
import javax.ejb.SessionContext;
import javax.ejb.Stateful;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.shaneseam.action.inte.WorkFlow;
import org.shaneseam.entitybean.WorkFlowDoc;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.bpm.BeginTask;
import org.jboss.seam.annotations.bpm.CreateProcess;
import org.jboss.seam.annotations.bpm.EndTask;
@Stateful
@Name("workflowaction")
public class WorkFlowAction implements WorkFlow{
@PersistenceContext
EntityManager em;
@Resource
SessionContext ctx;
@In(create=true)
@Out
WorkFlowDoc workFlowDoc;
@In (required=false)
@Out(scope=ScopeType.BUSINESS_PROCESS, required=false)
Long workFlowId;
@CreateProcess(definition="文档测试流程")
public String createDoc() {
em.persist(workFlowDoc);
workFlowId= workFlowDoc.getWorkFlowId();
return "success";
}
public String toPage(){
return "topage";
}
@BeginTask
@EndTask
public String taskOne() {
System.out.println("workFlowId========="+workFlowId);
workFlowDoc=(WorkFlowDoc)em.createQuery("select o from WorkFlowDoc o where o.workFlowId= :workFlowId")
.setParameter("workFlowId", workFlowId).getSingleResult();
return "accept";
}
public String toListNode()
{
return "tonodetwo";
}
@BeginTask
@EndTask
public String taskTwo() {
return "accept";
}
@BeginTask
@EndTask
public String taskThree() {
return "finish";
}
@Remove
public void destroy() {}
}
4 定义业务实体
/*******************************************************************************
* 文件名:WorkFlowDoc.java<br>
* 版本: <br>
* 描述: <br>
* 版权所有: <br>
* <br>
* 创建者: 沙振中 <br>
* 创建日期: May 12, 2009 <br>
*