首先下载开发工具Eclips : eclipse-SDK-3.2.1-win32.zip和流程引擎:jbpm-jpdl-suite-3.2.GA.zip
用JBPM自带设计器进行流程设计,如下图所示:
设计好后在processdefinition.xml代码加入任务:
<?xml version="1.0" encoding="UTF-8"?>
<process-definition
xmlns="urn:jbpm.org:jpdl-3.2" name="test01">
<start-state name="start">
<transition name="提交给张三审批" to="张三审批"></transition>
</start-state>
<task-node name="张三审批">
<task name="审批">
<assignment actor-id="张三"></assignment>
</task>
<transition name="提交给李四审批" to="李四审批"></transition>
</task-node>
<task-node name="李四审批">
<task name="审批">
<assignment actor-id="李四"></assignment>
</task>
<transition name="提交给王五审批" to="王五审批"></transition>
</task-node>
<task-node name="王五审批">
<task name="审批">
<assignment actor-id="王五"></assignment>
</task>
<transition name="结束流程" to="end1"></transition>
</task-node>
<end-state name="end1"></end-state>
</process-definition>
接下来用JBPM创建表
1.加入数据库驱动程序
2.修改hibernate.cfg.xml的数据源配置
3.创建Java创建表的测试程序
Jbpmtest_01CreatTable.java
public class Jbpmtest_01CreatTable extends TestCase {
public void testCreatTable(){
JbpmConfiguration.getInstance().createSchema();
}
}
表创建好后进行下一步部署:
创建 Jbmptest_01DeployProcessDefinition.java
public class Jbmptest_01DeployProcessDefinition extends TestCase {
static JbpmConfiguration jbpmConfiguration=JbpmConfiguration.getInstance();
public void testDeployProcessDefinition(){
//定义ProcessDefinition流程对象
ProcessDefinition def=ProcessDefinition.parseXmlResource("test01/processdefinition.xml");
JbpmContext Context=jbpmConfiguration.createJbpmContext();
try{
Context.deployProcessDefinition(def);
}catch(Exception e){
e.printStackTrace();
Context.setRollbackOnly();
}finally{
Context.close();
}
}
}
下一步创建公文:
创建 Jbpmtest_01CreatDocument.java
public class Jbpmtest_01CreatDocument extends TestCase {
static JbpmConfiguration jbpmConfiguration=JbpmConfiguration.getInstance();
public void testCreatDocument(){
//创建公文
JbpmContext Context=jbpmConfiguration.createJbpmContext();
try{
//创建公文对象
Document doc=new Document();
doc.setTitle("测试公文"+new Random().nextInt(9999));
Context.getSession().save(doc);
//创建流程实例对象
// 1.首先加载流程定义
ProcessDefinition def=Context.getGraphSession().findLatestProcessDefinition("test01");
//2.根据ProcessDefinition创建流程实例对象
ProcessInstance instance=new ProcessInstance(def);
Context.save(instance);
//把公文对象和流程实例对象绑定
doc.setProcessInstanceId(instance.getId());
Integer tmp=new Integer(doc.getId());
instance.getContextInstance().setVariable("DocumentId",tmp);
}catch(Exception e){
e.printStackTrace();
Context.setRollbackOnly();
}finally{
Context.close();
}
}
}
下一步:查询公文当前所在的环节
Jbpmtest_01CurrentNode.java
public class Jbpmtest_01CurrentNode extends TestCase {
static JbpmConfiguration jbpmConfiguration=JbpmConfiguration.getInstance();
public void testCurrentNode(){
//当前公文所处的环节
JbpmContext Context=jbpmConfiguration.createJbpmContext();
try{
//已知公文
Integer documentId=new Integer(2);
Document doc=(Document)Context.getSession().load(Document.class,documentId );
//得到公文流程对象
long processInstanceId=doc.getProcessInstanceId();
ProcessInstance instance=Context.getProcessInstance(processInstanceId);
System.err.println("公文【 "+doc.getTitle()+" 】当前所处的环节是:"+instance.getRootToken().getNode().getName());
}catch(Exception e){
e.printStackTrace();
Context.setRollbackOnly();
}finally{
Context.close();
}
}
}
下一步:将公文提交到第一个环节
创建 Jbpmtest_01SubmitDocument.java
public class Jbpmtest_01SubmitDocument extends TestCase {
static JbpmConfiguration jbpmConfiguration=JbpmConfiguration.getInstance();
public void testSubmitDocument(){
//将公文提交到第一个环节
JbpmContext Context=jbpmConfiguration.createJbpmContext();
try{
//已知公文
Integer documentId=new Integer(2);
Document doc=(Document)Context.getSession().load(Document.class,documentId);
//得到公文流程对象
long processInstanceId=doc.getProcessInstanceId();
ProcessInstance instance=Context.getProcessInstance(processInstanceId);
//将公文移交到下一个环节
instance.signal(); //对于一个公文只能执行一遍
}catch(Exception e){
e.printStackTrace();
Context.setRollbackOnly();
}finally{
Context.close();
}
}
}
下一步:查询流动到某个参与者手上的公文列表
创建 Jbmptest_01SearchMyTaskList.java
public class Jbmptest_01SearchMyTaskList extends TestCase {
static JbpmConfiguration jbpmConfiguration=JbpmConfiguration.getInstance();
//查询流动到某个参与者手上的公文列表【即待审公文列表】
public void testSearchMyTaskList(){
JbpmContext Context=jbpmConfiguration.createJbpmContext();
try{
//已知用户
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)
Integer docId = (Integer)taskInstance.getProcessInstance().getContextInstance().getVariable("DocumentId");
System.err.println(docId);
Document doc=(Document)Context.getSession().load(Document.class,docId );
System.err.println("正在等待【"+actorId+"】审批的公文是:"+doc.getTitle());
}
}
}
下一步:将待审公文流转到下一个节点
创建 Jbpmtest_01NextNode.java
public class Jbpmtest_01NextNode extends TestCase {
static JbpmConfiguration jbpmConfiguration=JbpmConfiguration.getInstance();
public void testNextNode(){
JbpmContext Context=jbpmConfiguration.createJbpmContext();
try{
Integer documentId=new Integer(2);
nextNode(Context,"张三",documentId); //将张三待审公文流转到下一个节点
//nextNode(Context,"李四",documentId);
//nextNode(Context,"王五",documentId);
}catch(Exception e){
e.printStackTrace();
Context.setRollbackOnly();
}finally{
Context.close();
}
}
private void nextNode(JbpmContext Context,String actorId,Integer documentId){
// 得到某个参与者(参与者对应节点)的所有任务实例,任务实例是流程实例流到某个节点(节点对应参与者)而产生的
List taskInstances = Context.getTaskMgmtSession().findTaskInstances(actorId);
for (Iterator iter = taskInstances.iterator(); iter.hasNext();) {
TaskInstance taskInstance = (TaskInstance) iter.next();
//得到某个任务实例所在的流程实例,然后从流程实例中拿到变量的信息(对应公文信息,这里拿到的是公文的id和title)
Integer docId = (Integer)taskInstance.getProcessInstance().getContextInstance().getVariable("DocumentId");
System.err.println(docId);
if(docId.equals(documentId)){
taskInstance.end();
Document doc=(Document)Context.getSession().load(Document.class,docId );
System.err.println("公文【"+doc.getTitle()+"】已经被【"+actorId+"】审批通过,现在继续往下流转!");
}
}
}
}
下一步:反复执行当前查询节点和将待审公文流转到下一个节点的操作直到当前节点为end,表示流程结束。
以上就是用JBPM工作流引擎完成整个流程的小测试.