jbpm4.3慣用操作

//得到流程定義
List<ProcessDefinition> pdL = repositoryService.createProcessDefinitionQuery().list();
//流程實例
List<ProcessInstance> piL = executionService.createProcessInstanceQuery().list();
//當前用戶的任務列表
List<Task> tL = taskService.findGroupTasks(username);
List<Task> tLByPerson = taskService.findPersonalTasks(username);

 

1、執行流程
   根據類ProcessInstance的屬性ID,執行流程

   String pid = processInstance.getId();
   executionService.signalExecutionById(pid);

   //獲取指定節點的Execution

 

   Execution exec = processInstance.findActiveExecutionIn("state1");  

   executionService.signalExecutionById(exec.getId(), "to end1");   

 

1、獲取activityNames

 Set<String> activityNames = processInstance.findActiveActivityNames();  
  if (activityNames == null) {  
      System.out.println("current activityNames is null" );  
  }  
  else {  
      for (String name: activityNames) {  
      System.out.println("activity name is "+name);   
      }  
  }

 

1、設置添加變量

 executionService.setVariable(pid, "content","task2");

 

  Map<String, Object> variables = new HashMap<String, Object>();
  variables.put("result", "ok");
 
taskService.setVariables(task.getId(), variables);

 

1、獲取變量

 Set<String> variableNames = taskService.getVariableNames(taskDbid);
 Map<String, Object> variables = taskService.getVariables(taskDbid, variableNames);

 

 

 

 

2、查找所有任務

 List<Task> ts = jbpmTemplate.getTaskService().createTaskQuery().list();
     for(Task t : ts){
      if(t.getName().equals("task1")){ 
       jbpmTemplate.completeTask(t.getId());//通過任務id讓任務向下流轉

     Map map = HashMap();

        map.put("day",day);

    jbpmTemplate.getTaskService().completeTask(t.getId(),map);//可以傳參數
  }

    }    }  

 

 

3、通過任務ID取指定變量的值

 String leaveId = (String) jbpmTemplate.getVariableByTaskId(taskId, "leaveId");

 String leaveId = (String) taskService.getVariable(taskId, "leaveId");

  //通過流程實例id取指定變量的值

  String pid = processInstance.getId();
  String answer = (String) executionService.getVariable(pid, "answer");

 

4、判斷流程是否執行在某個節點

 processInstance.isActive("submit document");

 

5、任務轉交

1.設置candidate-groups="lingo"
2.lingo可以通過findGroupsTasks()看到共享任務
3.使用assignTask(taskid, "admin")將這個任務轉交給admin
4.admin通過findPersonalTasks()看到待辦任務
5.admin通過completeTask()完成任務。
如果按照上面的步驟,jbpm-4.3下測試是通過的,下面是測試代碼:
        ProcessInstance processInstance = executionService
            .startProcessInstanceByKey("X0603CandidateGroupTest");

        List<Task> taskList = taskService.findGroupTasks("lingo");
        assertEquals(1, taskList.size());

        Task task = taskList.get(0);
        taskService.assignTask(task.getId(), "admin");
        taskList = taskService.findPersonalTasks("admin");
        assertEquals(1, taskList.size());
        taskService.completeTask(task.getId());

 

6、多條件判斷

  expr="#{a == 1 && b == 1}"

 

7、獲取一個流程中的個人任務

List<Task> taskList = taskService.findPersonalTasks("johndoe");
Task task = taskList.get(0);

大家要慎用以上方法

強烈推薦以下2個方法,以免造成許多不必要的錯誤。

  1. //根據節點名取一流程實例下的任務     
  2. Task task1 = taskService.createTaskQuery().processInstanceId(processInstance.getId()).activityName("經理簽收").uniqueResult();    
  3. //根據任務分配者userId取一流程實例下的任務    
  4. Task task2 = taskService.createTaskQuery().processInstanceId(processInstance.getId()).assignee(userId).uniqueResult();    
  5. 查看源碼可得知processInstance.getId()爲ExecutionID

8、獲得當前節點與獲得一個節點的後繼節點

獲得一個節點的後繼節點很簡單,只要getActivity()獲得當前節點,然後getOutgoingTransitions()獲得所有轉出的連線,然後遍歷連線獲得destination就可以了。
節點類型可以通過activity的getType()方法獲得。

 

9、怎麼得到上一節點

最簡單的,先獲得executionImpl,executionImpl.getActivity()獲得當前活動,然後根據activityImpl.getIncomingTransitions()獲得所有前面的連線,得到transitionImpl。然後根據transitionImpl.getSource()獲得連線的開始節點,這樣就獲得了前面的activity。
請注意,請注意,流程中的回退是千變萬化的,一定要小心注意。很難寫出通用的代碼來。

    1. public void execute(ActivityExecution activityExecution) throws Exception {   
    2.   
    3.         ExecutionImpl executionimpl = (ExecutionImpl) activityExecution;  
    4. DbSession dbsession = EnvironmentImpl.getFromCurrent(DbSession.class);   
    5.         TaskImpl taskimpl = dbsession.createTask();   

    10、獲取流程定義的xml文件

    在頁面上顯示流程定義的xml內容

    ProcessEngine processEngine = Configuration.getProcessEngine();
    RepositoryService repositoryService = processEngine.getRepositoryService();

    String pdId = request.getParameter("pdId");
    ProcessDefinition pd = repositoryService.createProcessDefinitionQuery().processDefinitionId(pdId).uniqueResult();

    Set<String> names = repositoryService.getResourceNames(pd.getDeploymentId());
    for (String n :names) {
    if (n.indexOf(".jpdl.xml") != -1) {
        InputStream in = repositoryService.getResourceAsStream(pd.getDeploymentId(), n);
        byte[] buffer = new byte[1024*4];
         int length;
         while ((length = in.read(buffer)) != -1) {
             response.getOutputStream().write(buffer, 0, length);
         }
         response.getOutputStream().close();
    }
            }

     

    11、獲取流程定義的名字

    如果需要流程定義的名字,需要通過repositoryService.createProcessDefinitionQuery().deploymentId(deploymentId).list()的方式先查詢得到ProcessDefinition,,再調用對應的getName()方法獲得流程定義名稱。


     

    12、請問在實現了AssignmentHandler的處理類中,如何得知是哪個節點調用的它?

    ((ExecutionImpl) openExecution).getActivity()


     

    13、JBPM4中如何獲取fork名字?

 

如果只爲了獲得定義中所有fork名稱,可以直接遍歷ProcessDeifnitionImpl中的activities,查找getType()爲"fork"的活動。

 

14、

public void assign(Assignable assignable, OpenExecution execution) {
  TaskImpl taskImpl = (TaskImpl)assignable;
  ExecutionImpl executionImpl = (ExecutionImpl)execution;

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章