JBPM4--No unnamed transitions were found for the task

//taskService.completeTask(taskId,map);//报错解决方案
	//解决方案如下:
	taskService.setVariables(taskId,map);
	taskService.completeTask(taskId);


一:出错场景


BPM4执行taskService.completeTask(taskId,map)或taskService.completeTask(taskId) 操作时,出现如下异常:

Console代码 
2011-3-1 14:57:00 org.jbpm.internal.log.Jdk14Log info   
信息: exception while executing command org.jbpm.pvm.internal.cmd.CompositeCmd@19d5db9   
org.jbpm.api.JbpmException: No transition named '申请' was found.  



2011-3-1 14:57:00 org.jbpm.internal.log.Jdk14Log info
信息: exception while executing command org.jbpm.pvm.internal.cmd.CompositeCmd@19d5db9
org.jbpm.api.JbpmException: No transition named '申请' was found.


Console代码 
No unnamed transitions were found for the task '申请'  

 No unnamed transitions were found for the task '申请'


这都是没有处理好Jbpm转移引起的问题。

Console代码 
No transition named '申请' was found  


No transition named '申请' was found是由于一个名为‘申请’的流入转移(或者流出转移)没有定义。
仔细查看xml,是不是写错了。
Xml代码 
<transition g="-5,-17" name="申请" to="部门领导审批"/>  

 <transition g="-5,-17" name="申请" to="部门领导审批"/>



Console代码 
No unnamed transitions were found for the task '申请'  


 No unnamed transitions were found for the task '申请'
是连接'申请'的task任务没有命名的转移被找到


二:问题解决


可以看到核稿,驳回等就是transtion,属于外向转移。
使用taskService.completeTask(taskId)
就会报错。
使用taskService.completeTask(taskId, "error_value")
也会报错。
如果流程走到办公核稿,
Java代码 
taskService.completeTask(taskId, "会签") ;   
//or   
taskService.completeTask(taskId, "驳回") ;  

taskService.completeTask(taskId, "会签") ;
//or
taskService.completeTask(taskId, "驳回") ;
这才是正确的!
了解Transtion
那么什么Transtion呢?!
Transtion:转移负责将各个活动定义连接起来,组成流程定义。

转移可分为流入转移和流出转移

三:原理分析

如果一个任务拥有一个没用名称的外向转移:
Java代码 
//返回包含一个null值集合,。   
taskService.getOutcomes()    
//会使用这个外向转移。   
taskService.completeTask(taskId)    
//会使用这个外向转移。   
taskService.completeTask(taskId, null)    
//会抛出一个异常。   
taskService.completeTask(taskId, "anyvalue")    
//返回包含一个null值集合,。
taskService.getOutcomes() 
//会使用这个外向转移。
taskService.completeTask(taskId) 
//会使用这个外向转移。
taskService.completeTask(taskId, null) 
//会抛出一个异常。
taskService.completeTask(taskId, "anyvalue")  



如果一个任务拥有一个有名字的外向转移:

Java代码  
//返回包含这个转移名称的集合。   
taskService.getOutcomes()    
// 会使用这个单独的外向转移。   
taskService.completeTask(taskId)   
//会抛出一个异常(因为这里没有无名称的转移)。   
taskService.completeTask(taskId, null)    
//会抛出一个异常。   
taskService.completeTask(taskId, "anyvalue")   
// 会根据给定的名称使用转移。    
 taskService.completeTask(taskId, "myName")  

//返回包含这个转移名称的集合。
taskService.getOutcomes() 
// 会使用这个单独的外向转移。
taskService.completeTask(taskId)
//会抛出一个异常(因为这里没有无名称的转移)。
taskService.completeTask(taskId, null) 
//会抛出一个异常。
taskService.completeTask(taskId, "anyvalue")
// 会根据给定的名称使用转移。 
 taskService.completeTask(taskId, "myName")

如果一个任务拥有多个外向转移,其中一个转移没有名称,其他转移都有名称:

Java代码 
//返回包含一个null值和其他转移名称的集合。   
taskService.getOutcomes()    
//会使用没有名字的转移。   
taskService.completeTask(taskId)    
//会使用没有名字的转移。   
taskService.completeTask(taskId, null)   
//会抛出异常。   
 taskService.completeTask(taskId, "anyvalue")    
//会使用名字为'myName'的转移。    
taskService.completeTask(taskId, "myName")   

//返回包含一个null值和其他转移名称的集合。
taskService.getOutcomes() 
//会使用没有名字的转移。
taskService.completeTask(taskId) 
//会使用没有名字的转移。
taskService.completeTask(taskId, null)
//会抛出异常。
 taskService.completeTask(taskId, "anyvalue") 
//会使用名字为'myName'的转移。 
taskService.completeTask(taskId, "myName") 

如果一个任务拥有多个外向转移,每个转移都拥有唯一的名字:
Java代码 
//返回包含所有转移名称的集合   
taskService.getOutcomes()    
//会抛出异常,因为这里没有无名称的转移。   
taskService.completeTask(taskId)   
//会抛出异常,因为这里没有无名称的转移   
 taskService.completeTask(taskId, null)    
//会抛出异常   
taskService.completeTask(taskId, "anyvalue")    
//会使用名字为'myName'的转移   
taskService.completeTask(taskId, "myName")   

//返回包含所有转移名称的集合
taskService.getOutcomes() 
//会抛出异常,因为这里没有无名称的转移。
taskService.completeTask(taskId)
//会抛出异常,因为这里没有无名称的转移
 taskService.completeTask(taskId, null) 
//会抛出异常
taskService.completeTask(taskId, "anyvalue") 
//会使用名字为'myName'的转移
taskService.completeTask(taskId, "myName") 

解决方案:
根据以上分析,可得到解决方案:
1、只拥有一个外向转移时(对应上文所述1、2情况):
Java代码 
Map map = new HashMap();map.put("",……)   
//各种参数   
taskService.setVariables(taskId,map);   
taskService.completeTask(taskId);  

Map map = new HashMap();map.put("",……)
//各种参数
taskService.setVariables(taskId,map);
taskService.completeTask(taskId);


3、拥有多个外向转移时(上文3、4种情况):
Java代码 
Map map = new HashMap();map.put("",……)   
//各种参数   
taskService.setVariables(taskId,map);   
//如想转移至有名称的外向转移:   
taskService.completeTask(taskId,"外向转移名称");   
//如想转移至无名称的外向转移:   
taskService.completeTask(taskId);   

Map map = new HashMap();map.put("",……)
//各种参数
taskService.setVariables(taskId,map);
//如想转移至有名称的外向转移:
taskService.completeTask(taskId,"外向转移名称");
//如想转移至无名称的外向转移:
taskService.completeTask(taskId); 

你可能感兴趣的:(transition)