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屬於通用數據表