activiti學習(三)——activiti流程引擎的服務、數據庫表與流程啓動

activiti流程引擎的服務

activit流程引擎爲用戶提供了好幾種服務及api,用於查詢和操作流程,通過ProcessEngine的getXXXService方法可以獲取。現在對幾個接下來會用得比較多的進行介紹:

  • RepositoryService:主要用於查詢和操作與部署有關的api。在流程部署的章節中,就是通過這個服務進行流程部署的;
  • RuntimeService:流程實例的操作與查詢。包括流程實例的查詢、啓動等;
  • TaskService:任務的查詢、完成、設置處理人等;
  • HistoryService:歷史流程實例、活動實例、任務實例等查詢與刪除;
  • ManagementService:命令和job執行。由於activiti採用命令模式,實質上很多流程引擎的操作最後是封裝成命令執行的。用戶也可以自行去調用已有的命令或自定義命令。job主要是和定時任務、異步執行有關。

 

流程啓動

上一章部署完畢後,我們現在可以把上一章的部署進行啓動。

首先我們查看一下數據庫裏流程定義表act_re_procdef的情況:

啓動流程的方式有多種,我們首先通過id來啓動:

package ProcessStart;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;

public class App {
	
	private ProcessEngine pe;

	public void getFromProcessEngineConfiguration() {
		ProcessEngineConfiguration pec = ProcessEngineConfiguration
				.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
		pe = pec.buildProcessEngine();
	}
	
	public void startProcessById() {
		RuntimeService runtimeService = pe.getRuntimeService();
		ProcessInstance pi = runtimeService.startProcessInstanceById("firstBpmProcess:1:4");
		System.out.println("流程定義ID:" + pi.getProcessInstanceId());
		System.out.println("流程實例ID:" + pi.getId());
	}

	public static void main(String[] args) {
		App app = new App();
		app.getFromProcessEngineConfiguration();
		app.startProcessById();
	}
}

運行之後,我們可以看看數據庫表的變化。先看看act_ru_execution表,已經有了流程實例的記錄: 

接着我們看看act_ru_task表,因爲流程啓動後從開始節點走向userTask1節點,因此在該表會有一個任務記錄:

另外在歷史表act_hi_actinst、act_hi_procinst和act_taskinst表也有變化,可以自行查看。

除了通過id來啓動流程,還可以通過key的方式:

public void startProcessByKey() {
    RuntimeService runtimeService = pe.getRuntimeService();
    ProcessInstance pi = runtimeService.startProcessInstanceByKey("firstBpmProcess");
    System.out.println("流程定義ID:" + pi.getProcessInstanceId());
    System.out.println("流程實例ID:" + pi.getId());
}

key的值就是我們流程文檔中process的id值。具體執行的效果就不展示了。

 

關於流程變量

每個流程實例,可以附帶一些信息,可以爲其添加流程變量。舉個例子,例如我想把這個流程節點的一些參數傳給下一個節點,那麼可以添加流程變量到流程實例上。當流程運行到下一個節點時,從下一個節點取出來。實際生產中常見的流程指定下環節處理人,就是當前節點選中下環節處理人,把處理人作爲流程變量添加到流程實例中,待節點提交流程後,通過監聽器獲取變量並設置到下個環節處理人上。這裏先展示流程啓動時添加變量的結果:

public void startProcessByIdWithVars() {
    RuntimeService runtimeService = pe.getRuntimeService();
    Map<String, Object> vars = new HashMap<String, Object>();
    Student student = new Student();
    vars.put("param1", "value1");
    vars.put("param2", student);
    ProcessInstance pi = runtimeService.startProcessInstanceById("firstBpmProcess:1:4", vars);
    System.out.println("流程定義ID:" + pi.getProcessInstanceId());
    System.out.println("流程實例ID" + pi.getId());
}

運行之後,可以看到act_ru_execution增加了一條記錄

同時我們可以查看act_ru_variable表,這裏記錄了流程變量。

流程變量的value值不僅限於String類型,對象也是可以作爲變量的值傳遞進去的,例如param2的值。當然對象必須實現Serializable接口。對象變量的值會被放到act_ge_bytearray表存儲。

 

activiti數據庫表:

activiti的數據庫表有以下這些:

其實從命名就能大概看出這些表是什麼意思。具體的含義,各位在後續的學習和實操過程中慢慢去理解比較好。這裏稍微點一下:

  • act_hi_xxx表示的是歷史表,就是歷史記錄;
  • act_ru_xxx表示運行時表,例如上面啓動一個流程,可以在act_ru_execution找到一條正在運行的流程實例;
  • act_re_xxx一般是靜態表,包含流程部署、流程定義等;
  • act_ge_xxx屬於通用數據表

 

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