HelloWorld
做一個最簡單的HellWorld流程用代碼的方式實現並且走完流程。
以下是涉及到的比較重要的八張表
SELECT * FROM act_re_deployment; -- 一 流程部署表
SELECT * FROM act_ge_bytearray; -- 二 流程二進制表
SELECT * FROM act_re_procdef; -- 三 流程定義表
SELECT * FROM act_ru_execution; -- 四 流程正在運行表
SELECT * FROM act_hi_procinst; -- 五 流程實例歷史表
SELECT * FROM act_ru_task; -- 六 流程當前任務表
SELECT * FROM act_hi_taskinst; -- 七 流程歷史任務表
SELECT * FROM act_hi_actinst; -- 八 流程歷史活動節點表
相關步驟如下:
1.首先是需要部署流程定義。
2.啓動流程實例。
3.查看流程任務以及完成流程任務。
先決工作,成員變量定義
-
獲取流程實例引擎ProcessEngines;
-
獲取RepositoryService;
-
獲取RuntimeService;
-
獲取TaskService;
-
獲取HistoryService
/** * 獲取默認的流程引擎實例 會自動讀取activiti.cfg.xml文件 */ private ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine(); //定義一個成員變量 RepositoryService repositoryService; RuntimeService runtimeService; TaskService taskService; HistoryService historyService; /** * 獲取流程引擎 */ @Before public void setUp() throws Exception { ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); repositoryService = processEngine.getRepositoryService(); runtimeService = processEngine.getRuntimeService(); taskService = processEngine.getTaskService(); historyService = processEngine.getHistoryService(); }
部署流程定義圖:
/**
* 部署流程定義
*/
@Test
public void deploy(){
// 獲取部署對象
Deployment deployment=processEngine.getRepositoryService() // 部署Service
.createDeployment() // 創建部署
.addClasspathResource("diagrams/MyProcess.bpmn") // 加載資源文件
// .addClasspathResource("diagrams/helloWorld.png") // 加載資源文件
// .name("HelloWorld流程") // 流程名稱
.deploy(); // 部署
System.out.println("流程部署ID:"+deployment.getId());
System.out.println("流程部署Name:"+deployment.getName());
}
執行結果:
流程部署ID:17501
流程部署Name:null
接着啓動流程實例,這樣一個流程纔開始:
/**
* 啓動流程
*/
@Test
public void startProcess() {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess");
String processInstanceId = processInstance.getId();
String activityId = processInstance.getActivityId();
String definitionId = processInstance.getProcessDefinitionId();
System.out.println("流程實例ID:"+processInstanceId);
System.out.println("正在活動的節點ID:"+activityId);
System.out.println("流程定義ID:"+definitionId);
}
執行結果:
流程實例ID:20001
正在活動的節點ID:usertask1
流程定義ID:myProcess:2:17504
查詢正在運行的實例:
/**
* 查詢正在運行的實例
*/
@Test
public void queryExecution(){
List<Execution> executionList = runtimeService.createExecutionQuery() //創建正在執行的流程查詢對象
.processDefinitionKey("myProcess") //根據流程定義的key查詢
.orderByProcessInstanceId() //根據流程實例id排序
.desc() //倒序
.list(); //查詢出集合
for(Execution execution: executionList){
System.out.println("正在執行的流程對象的id: "+execution.getId());
System.out.println("所屬流程實例的id:"+execution.getProcessInstanceId());
System.out.println("正在活動的節點的id: "+execution.getActivityId());
System.out.println("任務名稱: "+execution.getName());
}
}
執行結果:
正在執行的流程對象的id: 20001
所屬流程實例的id:20001
正在活動的節點的id: usertask1
任務名稱: null
查看一下白夜行這個用戶的任務信息:
/**
* 根據辦理人查詢任務
*/
@Test
public void queryTaskByAssignee(){
String assignee = "白夜行"; // assignee 要與流程圖上的 Assignee 相同纔會被查詢到,否則就不返回該任務對象
// 查詢並且返回任務即可
List<Task> taskList = taskService.createTaskQuery() // 任務相關Service // 創建任務查詢
.processDefinitionKey("myProcess")
.taskAssignee(assignee)// 指定某個人
.orderByTaskCreateTime()
.desc()
.list();
for(Task task: taskList){
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());
}
}
執行結果:
任務ID:20004
任務名稱:myprocess
任務創建時間:Thu Mar 12 10:02:57 CST 2020
任務委派人:白夜行
流程實例ID:20001
查詢當前流程實例狀態
/**
* 查詢當前流程實例狀態
*/
@Test
public void queryProInstanceStateByProInstanceId(){
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId("12501").singleResult();
if(processInstance == null){
System.out.println("當前流程已經完成");
}else{
System.out.println("當前流程實例ID:"+processInstance.getId());
System.out.println("當前流程所處的位置:"+processInstance.getActivityId());
}
}
執行結果:
當前流程實例ID:20001
當前流程所處的位置:usertask1
最後完成HelloWorld節點任務,把流程走完:
/**
* 完成任務
*/
@Test
public void completeTask(){
TaskQuery query = taskService.createTaskQuery(); //創建任務查詢對象
List<Task> list = query.processDefinitionKey("myProcess") //指定流程定義
.taskAssignee("白夜行") //指定委託人
.list(); //執行查詢
for (Task task : list) {
System.out.println(task);
//taskService某些框架下需要使用@Autowired註解裝配
taskService.complete(task.getId()); //完成任務,使任務進入下一步
}
}
查詢流程實例歷史
/**
* 查詢流程實例歷史
*/
@Test
public void queryHistory(){
//1.創建流程實例的歷史查詢對象,historyService使用@Autowired註解注入
HistoricProcessInstanceQuery query = historyService.createHistoricProcessInstanceQuery();
HistoricProcessInstance instance =
query
.processInstanceId("12501") //流程實例的id
.finished() //調用這個方法後未完成的流程實例會返回null
.singleResult();
System.out.println(instance);
}
這裏引出一個概念,流程定義和流程實例的關係,可以把這兩種關係理解成是類和對象的關係。
流程定義是一個模板,而流程實例就是通過模板演變出來的具體的可用的東西。
首先當運行:deploy()部署流程定義方法,在數據庫中流程定義表會發生一些變化新增了一條數據,
act_re_deployment流程定義部署表:
然後act_re_prodef流程定義表也會有一條數據插入:
以及在act_ge_bytearray表中用來存儲資源信息:
接着來運行start()啓動流程實例:
act_ru_task運行時流程任務表新增了一條數據:
act_ru_execution 運行時流程執行表:
act_ru_identitulink是用於執行主體相關信息表:
可以查看剛剛"白夜行”這個用戶的任務:
運行findTask()查看用戶任務,控制檯輸出如下:
任務ID:20004
任務名稱:myprocess
任務創建時間:Thu Mar 12 10:02:57 CST 2020
任務委派人:白夜行
流程實例ID:20001
completeTask()方法完成任務:
然後數據庫中ru開頭的運行時候所有表的數據都沒了,因爲現在流程結束,不需要這些數據了。
在hi開頭的表裏,會新增不少數據,這些數據主要是用來歸檔查詢用的,也就是歷史數據。
act_hi_taskinst 歷史流程實例任務表加了一條任務數據;
act_hi_procinst 歷史流程實例實例表加了一條流程實例相關信息的數據(包括開始時間,結束時間等等信息);
act_hi_identitylink 歷史流程實例參數者的表加了一條數據;
act_hi_actinst 歷史活動節點表加了三條流程活動節點信息的數據(每個流程實例具體的執行活動節點的信息);
轉載自 :Activity-(五)HelloWorld實現