1. 程式人生 > >Activiti工作流(二)6.0原始碼檢視及如何使用自己的使用者表和群組表

Activiti工作流(二)6.0原始碼檢視及如何使用自己的使用者表和群組表

一、從執行過程分析

 //查詢任務
    @Test
    public  void  excuteTask()
    {
        List<Task> tasks = taskService.createTaskQuery()
                .taskCandidateOrAssigned("曉")
                .list();
        if(tasks!=null && tasks.size()>0){
            for(Task task:tasks){
                System.out.println("任務ID:"+task.getId());
                System.out.println("任務名稱:"+task.getName());
                System.out.println("任務的建立時間:"+task.getCreateTime());
                System.out.println("任務的辦理人:"+task.getAssignee());
                System.out.println("流程例項ID:"+task.getProcessInstanceId());
                System.out.println("執行物件ID:"+task.getExecutionId());
                System.out.println("流程定義ID:"+task.getProcessDefinitionId());
                System.out.println("########################################################");
            }
        }
    }

1.可以看出使用TaskService建立TaskQuery物件進行查詢,TaskQuery只儲存引數條件

2.TaskQuery物件從CommandContext中獲取TaskEntityManager物件進行查詢

3.TaskEntityManager呼叫TaskDataManager物件獲取資料-介面實現類MybatisTaskDataManager

4.MybatisTaskDataManager中從CommandContext獲取DbSqlSession物件進行會話與資料庫互動。

  public <T> T getSession(Class<T> sessionClass) {
    Session session = sessions.get(sessionClass);
    if (session == null) {
      SessionFactory sessionFactory = sessionFactories.get(sessionClass);
      if (sessionFactory == null) {
        throw new ActivitiException("no session factory configured for " + sessionClass.getName());
      }
      session = sessionFactory.openSession(this);
      sessions.put(sessionClass, session);
    }

    return (T) session;
  }

可以看出key就是DbSqlSession.class

另外6.0中AbstractManager已經不實現Session介面,過往的自定義群組表和使用者表方法都會失效

那麼要6.0如何自定義群組表和使用者表呢?如果專案不是使用的6.0,建議直接跳到7.0使用。

首先必須知道為什麼要群組表和使用者表。原因是為了利用原生的Api,實現查詢,流程中配置了group,便能根據使用者查詢任務。

二、自定義使用者表和群組表

只要用自定義的類替換掉GroupEntityManagerImpl載入進ProcessEngineConfigurationImpl配置類就行了