本帖最后由 folksdreamY 于 2011-09-09 16:20:30 编辑

解决方案 »

  1.   

    神奇的CSDN,请赐我一个jPBM高手吧!
      

  2.   

    taskService.complete(taskId);就行的,你多了"to ended",如果有两个transition的话,就加上路径
      

  3.   

    先谢谢你哈!这么多天了,你是第一个帮忙的!难道都是月亮惹的祸?我去掉试了,还是一样的的情况,findActiveActivityNames()的结果依然是task1,pi.isEnded()的结果依然是false!
    以下是我的测试代码:package com.yknife;import java.util.Iterator;
    import java.util.List;
    import java.util.Set;import junit.framework.TestCase;
    import org.jbpm.api.*;
    import org.jbpm.api.task.Task;public class MyTask extends TestCase {

    ProcessEngine processEngine;
    public MyTask(){
    processEngine = Configuration.getProcessEngine();
    }

    public void setUp(){
    RepositoryService repositoryService = processEngine.getRepositoryService();
    repositoryService.createDeployment().addResourceFromClasspath("task.jpdl.xml").deploy();
    }
    public void testTask(){

    ExecutionService es = processEngine.getExecutionService();
    ProcessInstance pi = es.startProcessInstanceByKey("task");
    TaskService ts = processEngine.getTaskService();
    List<Task> list = ts.findPersonalTasks("yknife");
    Task task = list.get(0);
    String taskId = task.getId();
    ts.completeTask(taskId);
    Set set = pi.findActiveActivityNames();
    Iterator it = set.iterator();
    while(it.hasNext()){
    System.out.println(it.next());
    }
    assertTrue(pi.isEnded());
    }
    }
      

  4.   

    不好意思,一天没登陆,没发现。package com.yknife;import java.util.Iterator;
    import java.util.List;
    import java.util.Set;import junit.framework.TestCase;
    import org.jbpm.api.*;
    import org.jbpm.api.history.HistoryProcessInstance;
    import org.jbpm.api.task.Task;public class MyTask extends TestCase {
        
        ProcessEngine processEngine;
        public MyTask(){
            processEngine = Configuration.getProcessEngine();
        }
        
        public void setUp(){
            RepositoryService repositoryService = processEngine.getRepositoryService();
            repositoryService.createDeployment().addResourceFromClasspath("task.jpdl.xml").deploy();
        }
        public void testTask(){
            
            ExecutionService es = processEngine.getExecutionService();
            HistoryService hs = processEngine.getHistoryService();
            
            ProcessInstance pi = es.startProcessInstanceByKey("task");
            TaskService ts = processEngine.getTaskService();
            List<Task> list = ts.findPersonalTasks("yknife");
            Task task = list.get(0);
            String taskId = task.getId();
            ts.completeTask(taskId);
            
            //查看历史流程表,可以断言流程已经结束了
            HistoryProcessInstance hpi = hs.createHistoryProcessInstanceQuery().processInstanceId(pi.getId()).uniqueResult();
            assertTrue("ended".equals(hpi.getState()));
            
            //查看任务表任务,可以通过任务不存在了
            List<Task> taskList = ts.createTaskQuery().processInstanceId(pi.getId()).list();
            assertTrue(taskList.size()==0);
        }
    }
    测试失败的原因在于,在断言的时候,你的流程还是没有结束任务时候的流程,当你结束任务的时候,你需要再重新查一下流程,pi = es.findProcessInstanceById(pi.getId());
    再断言,不过你只有一个任务,在任务结束后,pi查出来应该是空的,这个时候你需要通过历史流程服务来查了。
      

  5.   

    findActiveActivityNames()的结果依然是task1对于这个问题,你需要建2个任务,完成一个任务后,再试试下面的代码,需要重查一下流程。pi = es.findProcessInstanceById(pi.getId());
    Set set = pi.findActiveActivityNames();
            Iterator it = set.iterator();
            while(it.hasNext()){
                System.out.println(it.next());
            }
      

  6.   

    谢谢啦,问题解决啦!
    我发现关键的问题在pi变量在completeTask()后没有刷新,pi依然还是未完成的任务前的pi,所以findActiveActivityNames()结果依然是task1。