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);