No unnamed transitions were found for the task'' Or No transition named ''was..

一:出错场景


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

 
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.


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


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

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


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

是连接'申请'的task任务没有命名的转移被找到


二:问题解决


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

这才是正确的!
了解Transtion
那么什么Transtion呢?!
Transtion:转移负责将各个活动定义连接起来,组成流程定义。

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

三:原理分析

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



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

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


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

//返回包含一个null值和其他转移名称的集合。
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情况):
Map map = new HashMap();map.put("",……)
//各种参数
taskService.setVariables(taskId,map);
taskService.completeTask(taskId);

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






你可能感兴趣的:(java,jbpm,J#)