jbpm教程(七)从开始节点和从中间节点 搜索可选路径

7 篇文章 0 订阅
package com.sxito.jbpm;
 
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 
 import junit.framework.TestCase;
 
 import org.jbpm.JbpmConfiguration;
 import org.jbpm.JbpmContext;
 import org.jbpm.graph.def.Transition;
 import org.jbpm.graph.exe.ProcessInstance;
 import org.jbpm.taskmgmt.def.Task;
 import org.jbpm.taskmgmt.exe.TaskInstance;
 
 
 public class Jbpm_08_SearchNextTransactions extends TestCase {
 	//获取jbpm配置
 	static JbpmConfiguration jbpmConfiguration =  JbpmConfiguration.getInstance();
 	/**
 	 * 目的::::从开始节点搜索可选路径 
 	 * 实现方法 根据公文Id得到公文对象  
 	 * 根据公文得到流程实例编号  
 	 * 根据流程编号编号得到流程实例
 	 * 根据流程实例得到RootToken	
 	 * 根据RootToken得到当前节点根据当前节点找到离开的线(该方法无法执行流程定义里的条件)
 	 * 根据RootToken得到可利用的线(判断条件执行后的线)
 	 * 如果调用一下signal()方法 则会随即选取一个 
 	 * 如果调用signal()方法的时候指定参数TransactionName则按指定的transaction往下流
 	 * 如果碰到fork和join节点   在fork节点会把所有的分支都列出来!!
 	 */
 	public void testSearchNextTransactionsFromStartStatus(){
 		
 		//创建jbpm上下文对象
 		JbpmContext context = jbpmConfiguration.createJbpmContext();
 		try{
 			int documentId = 15;
 			Document doc = (Document)context.getSession().load(Document.class, documentId);
 			long processInstanceId = doc.getProcessInstanceId();
 			ProcessInstance instance = (ProcessInstance) context.getProcessInstance(processInstanceId);
 //			List transactions =  instance.getRootToken().getNode().getLeavingTransitions();
 			Set transactions =  instance.getRootToken().getAvailableTransitions();
 			for (Iterator<Transition> iterator = transactions.iterator(); iterator
 					.hasNext();) {
 				Transition transition = (Transition) iterator.next();
 				System.err.println("公文【"+doc.getTitle()+"】的下一步可选节点为【"+transition.getName()+"】");
 			}
 		}catch(Exception e){
 			e.printStackTrace();
 			context.setRollbackOnly();
 		}finally{
 			context.close();
 		}
 	}
 /**
  * 从中间的tasknode节点如何得到离开的线
  * 
  * 根据用户找到他的所有任务实例(TaskInstance)对象
  * 遍历任务实例(TaskInstance)对象找到与该任务实例(TaskInstance)对应的流程实例(ProcessInstance)对象
  * 并获得该流程实例(ProcessInstance)对象相关的公文id(documentId)
  * 如果该公文就是要查找到准备离开的公文
  * 找到该公文可利用的离开的线
  * 遍历这些线并打印出来
  */
 	public void testSearchNextTransactionsFromTaskNode(){
 		//创建jbpm上下文对象
 		JbpmContext context = jbpmConfiguration.createJbpmContext();
 		try{
 			String actorId = "张三";
 			int documentId = 1;
 			List nextInstance = context.getTaskMgmtSession().findTaskInstances(actorId);
 			for (Iterator iterator1 = nextInstance.iterator(); iterator1
 					.hasNext();) {
 				TaskInstance taskInstance = (TaskInstance) iterator1.next();
 				Integer docId = (Integer) taskInstance.getProcessInstance().getContextInstance().getTransientVariable("documentId");
 				Document doc = (Document)context.getSession().load(Document.class, docId);
 				if(docId.equals(documentId)){
 					List  ti = taskInstance.getAvailableTransitions();
 					for (Iterator iterator = ti.iterator(); iterator.hasNext();) {
 						Transition transition = (Transition) iterator.next();
 						System.err.println("公文【"+doc.getTitle()+"】的下一步可选节点为【"+transition.getName()+"】");
 					}
 				}
 			}			
 		}catch(Exception e){
 			e.printStackTrace();
 			context.setRollbackOnly();
 		}finally{
 			context.close();
 		}
 	}
 	
 }
 

附一含有条件的流程定义文件(条件即为日期,日期大于10 就给张三审批 小于等于10就给李四审批)日期对象在创建公文时被放到流程定义里去了

<?xml version="1.0" encoding="UTF-8"?>
 
 <process-definition
   xmlns=""  name="test05">
    <start-state name="test10开始"><!-- condition务必要使用大括号  我用的小括号怎么找都找不到原因浪费了好多时间 -->
       <transition name="提交给test10张三审批" to="test10张三审批" condition="#{days gt 10}"></transition>
       <transition name="提交给test10李四审批" to="test10李四审批" condition="#{days le 10}"></transition>
    </start-state>
    <task-node name="test10张三审批">
    		<task name="">
    			<assigment actor-id = "张三"></assigment>
    		</task>
       <transition name="test10即将结束1" to="test10结束"></transition>
    </task-node>
    <task-node name="test10李四审批">
    		<task name="">
    			<assigment actor-id = "李四"></assigment>
    		</task>
       <transition name="test10即将结束2" to="test10结束"></transition>
    </task-node>
    <end-state name="test10结束"></end-state>
 </process-definition>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值