Activiti的學習(二)——核心API及Activiti的HelloWorld程式
一、核心API
①ProcessEngine物件 流程引擎物件
說明:
1) 在Activiti中最核心的類,其他的類都是由他而來。
2) 產生方式
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
3)可以產生RepositoryService
RepositoryService repositoryService =processEngine.getRepositoryService();
4) 可以產生 RuntimeService
RuntimeService
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