1. 程式人生 > >Activiti的學習(二)——核心API及Activiti的HelloWorld程式

Activiti的學習(二)——核心API及Activiti的HelloWorld程式

一、核心API

①ProcessEngine物件 流程引擎物件

說明:

1) 在Activiti中最核心的類,其他的類都是由他而來。

2) 產生方式

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

3)可以產生RepositoryService

RepositoryService repositoryService =processEngine.getRepositoryService();

4) 可以產生 RuntimeService

RuntimeService

runtimeService = processEngine.getRuntimeService();

5) 可以產生TaskService

TaskService taskService =processEngine.getTaskService();

各個Service的作用

②RepositoryService

Activiti的倉庫服務類。所謂的倉庫指流程定義文件的兩個檔案:bpmn檔案和流程圖片該service可以用來刪除部署的流程定義。

③RuntimeService

Activiti的流程執行服務類,可以從這個服務類中獲取很多關於流程執行的相關的資訊。

④TaskService

Activiti的任務服務類。可以從這個類中獲取任務的相關資訊,如當前正在執行的個人待辦和使用者組待辦任務。

⑤HistoryService

Activiti的查詢歷史資訊的類,在一個流程執行完成後,這個物件為我們提供查詢歷史資訊,可以跟蹤流程例項對應所有待辦節點的執行情況。

⑥ProcessDefinition

流程定義類,可以從這裡獲得資原始檔等。

⑦ProcessInstance

代表流程定義的執行例項,當一個部署的流程圖啟動後,該流程只有一條流程例項資料,但是它的流程任務可以有多個,每個任務對應流程圖中相應的流程節點。

二、HelloWorld程式

建立一個請假的流程

在上篇部落格中,我已經搭建好環境,也寫好配置檔案,以及生成了資料庫的25張表,這裡就不再多說。

首先建立流程圖,bpmn:

各節點id和名字,以及處理人:

任務id和名字:

整個流程是這樣的:A使用者可以提交申請,然後先由B使用者審批,B使用者審批後,再由C使用者審批,C審批後整個流程就完成。

①獲取到ProcessEngine核心物件

這裡在測試類裡面進行,利用註解@Before獲取

    ProcessEngine processEngine = null;

    @Before
    public void init(){
        processEngine = ProcessEngines.getDefaultProcessEngine();
    }

②部署流程定義,即將之前畫的流程圖部署到資料庫

/**
     * 部署流程定義(操作資料表:act_re_deployment、act_re_procdef、act_ge_bytearray)
     */
    @Test
    public void test1(){
        RepositoryService service = processEngine.getRepositoryService();
        Deployment deployment = service.createDeployment()
                .name("helloworld入門")
                .addClasspathResource("diagrams/HelloWorld.bpmn")
                .addClasspathResource("diagrams/HelloWorld.png")
                .deploy();
        System.out.println(deployment.getId());
        System.out.println(deployment.getName());
    }

③查詢流程定義列表

    /**
     * 查詢流程定義列表
     */
    @Test
    public void test2() {
        // 流程定義查詢物件,用於查詢表act_re_procdef
        ProcessDefinitionQuery query = processEngine.getRepositoryService().createProcessDefinitionQuery();
        // 新增過濾條件,即根據之前畫好的流程圖的id來查詢
        query.processDefinitionKey("HelloWorldKey");
        List<ProcessDefinition> list = query.list();
        for (ProcessDefinition pd : list) {
            System.out.println(pd.getId() + "--" + pd.getName());
        }
    }

④啟動流程例項

    /**
     * 啟動流程例項
     * runtimeService.startProcessInstanceByKey("HelloWorldKey")
     * 中的HelloWorldKey對應流程圖中的ID值,在資料表中對應act_re_procdef流程定義表中的key欄位;
     * 在act_ru_execution中產生一條資料,這條資料為當前流程正在執行的任務,其中act_id_欄位的值對應流程圖節點的ID值;
     * 在act_ru_task表中會產生一條任務資料,execution_id_對應act_ru_execution主鍵,proc_inst_id_為流程例項ID,
     * name_值為流程節點名稱,assignee_欄位為該待辦當前的處理;
     */
    @Test
    public void test03(){
        String processDefinitionKey = "HelloWorldKey";
        //獲取正在執行流程例項和執行物件相關的service
        RuntimeService runtimeService = processEngine.getRuntimeService();
        //使用流程定義key啟動流程例項,key物件是HelloWorld.bpmn檔案中的ID屬性值,對應的是act_re_procdef表中的key
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);
        System.out.println(processInstance.getId()); //流程例項ID
    }

⑤查詢個人任務列表,即查詢A使用者可以操作的流程,即A使用者可以提交申請

    /**
     * 查詢個人任務列表
     */
    @Test
    public void test04() {
        TaskQuery query = processEngine.getTaskService().createTaskQuery();
        String assignee = "A";
        query.taskAssignee(assignee);
        List<Task> list = query.list();
        for (Task task : list) {
            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());
        }
    }

⑥辦理任務,即A使用者提交請假申請,使用的是待辦任務的id

    /**
     * 辦理任務
     * taskId對應act_ru_task表的主鍵ID,因為當前待辦任務為第一個節點提交申請,
     * 當執行完這個待辦後下一條待辦資料將會流轉到審批【部門經理】那,然後以此類推
     * 可以將部門經理和總經理的待辦任務全部查詢和執行完成。
     */
    @Test
    public void test05(){
        String taskId= "2504";
        processEngine.getTaskService().complete(taskId);
        System.out.println("辦理完成,任務ID是:"+taskId);
    }

此時流程會自動提交給B使用者,到⑤處執行查詢B使用者的流程,就可以看到,B使用者有了需要辦理的流程

    /**
     * 查詢個人任務列表
     */
    @Test
    public void test04() {
        TaskQuery query = processEngine.getTaskService().createTaskQuery();
        String assignee = "B";
        query.taskAssignee(assignee);
        List<Task> list = query.list();
        for (Task task : list) {
            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());
        }
    }

然後B使用者去處理該流程,即⑥

    /**
     * 辦理任務
     * taskId對應act_ru_task表的主鍵ID,因為當前待辦任務為第一個節點提交申請,
     * 當執行完這個待辦後下一條待辦資料將會流轉到審批【部門經理】那,然後以此類推
     * 可以將部門經理和總經理的待辦任務全部查詢和執行完成。
     */
    @Test
    public void test05(){
        String taskId= "5002";
        processEngine.getTaskService().complete(taskId);
        System.out.println("辦理完成,任務ID是:"+taskId);
    }

然後流程又會提交到C使用者,C使用者也可以查詢到需要處理的流程任務

    /**
     * 查詢個人任務列表
     */
    @Test
    public void test04() {
        TaskQuery query = processEngine.getTaskService().createTaskQuery();
        String assignee = "C";
        query.taskAssignee(assignee);
        List<Task> list = query.list();
        for (Task task : list) {
            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());
        }
    }

C使用者處理路程任務:

    /**
     * 辦理任務
     * taskId對應act_ru_task表的主鍵ID,因為當前待辦任務為第一個節點提交申請,
     * 當執行完這個待辦後下一條待辦資料將會流轉到審批【部門經理】那,然後以此類推
     * 可以將部門經理和總經理的待辦任務全部查詢和執行完成。
     */
    @Test
    public void test05(){
        String taskId= "7502";
        processEngine.getTaskService().complete(taskId);
        System.out.println("辦理完成,任務ID是:"+taskId);
    }

 

至此,整套流程執行完畢。

小結:

1.Activiti框架提供的Service物件

RepositoryService----操作靜態的資源(流程定義,bpmn、png)

RuntimeService-----操作流程例項(啟動流程例項、查詢流程例項、結束流程例項)

TaskService-----操作任務(查詢任務、辦理任務)

HistoryService----操作歷史資料

2.Activiti框架提供的物件(和表有對應關係)

Deployment-----act_re_deployment

ProcessDefinition----act_re_procdef

ProcessInstance-----act_ru_execution

Task-----act_ru_task