JBPM4之基础概念3-任务管理



 

 import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipInputStream;

import org.jbpm.api.Configuration;
import org.jbpm.api.ExecutionService;
import org.jbpm.api.HistoryService;
import org.jbpm.api.ManagementService;
import org.jbpm.api.ProcessDefinition;
import org.jbpm.api.ProcessEngine;
import org.jbpm.api.ProcessInstance;
import org.jbpm.api.RepositoryService;
import org.jbpm.api.TaskService;
import org.jbpm.api.task.Task;

public class Test {
 ProcessEngine processEngine;
 public static void main(String[] args) {
  Test t=new Test();
  t.process();
 }
 
 public  void process() {
  ProcessEngine processEngine=Configuration.getProcessEngine();
  RepositoryService repositoryService=processEngine.getRepositoryService();
  ExecutionService executionService =processEngine.getExecutionService();
  TaskService  taskService=processEngine.getTaskService();
  
  //部署流程
  String pid=repositoryService.createDeployment().addResourceFromClasspath("hellworld.jpdl.xml").deploy();
  //部署zip文件流程
  //ZipInputStream zis=new ZipInputStream(this.getClass().getResourceAsStream("/aa.zip"));
  //repositoryService.createDeployment().addResourcesFromZipInputStream(zis).deploy();
  //创建实例
  Map map=new HashMap();
  map.put("user", "sunbin");
  ProcessInstance processInstance=executionService.startProcessInstanceByKey("hellworld",map);
  //获取任务
  List<Task> taskList=taskService.findPersonalTasks("sunbin");
  for(Task task  :taskList){
   System.out.println(task.getActivityName());
   System.out.println(task.getId());
   System.out.println(task.getAssignee());

  //接收任务
   taskService.takeTask(task.getId(),"sunbin");
   //提交任务
   taskService.completeTask(task.getId(),"to 试测3");
   Set<String> ActivityNames=processInstance.findActiveActivityNames();
   System.out.println(ActivityNames);
   //更新后看到最新id
   processInstance=executionService.findProcessInstanceById(processInstance.getId());
   System.out.println(processInstance.isActive("试测3"));

  }
 }
}

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

No unnamed transitions were found for the task 'XXXX'....................

 

-------------------------------------------------------------------------------------------------------------------------------------------------------------

考虑再三还是把参考中的原因分析写上吧,这样会更完整些,方便查看,省的各种查找了:

原理分析:

1.如果一个任务拥有一个没用名称的外向转移:

复制代码
//返回包含一个null值集合,。  
taskService.getOutcomes()   
//会使用这个外向转移。  
taskService.completeTask(taskId)   
//会使用这个外向转移。  
taskService.completeTask(taskId, null)   
//会抛出一个异常。  
taskService.completeTask(taskId, "anyvalue") 
复制代码

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

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

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

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

4.如果一个任务拥有多个外向转移,每个转移都拥有唯一的名字:

复制代码
//返回包含所有转移名称的集合
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);

2、拥有多个外向转移时(上文3、4种情况):

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

猜你喜欢

转载自sunbin.iteye.com/blog/1736325