您好,登錄后才能下訂單哦!
在工作流中,我們一切工作流的基本就是工作引擎(ProcessEngine),繼承于EngineService接口,包括流程部署,數(shù)據(jù)庫連接都是靠著ProcessEngine來實現(xiàn)的。而ProcessEngineConfiguration:流程引擎配置,可以設(shè)置數(shù)據(jù)庫等,默認的數(shù)據(jù)庫是h3,持久化實現(xiàn)使用的Mybatis,這里我們用的是mysql。
那么既然無論是jbpm或者是activiti都需要ProcessEngine來驅(qū)動,那么我們就說一下工作流引擎的使用吧。
當(dāng)我們將我們的業(yè)務(wù)畫成圖的時候,然后利用工作流引擎部署,也就是將我們的流程圖信息放到數(shù)據(jù)庫,圖和代碼如下:
[java] view plain copy
/**部署流程定義*/
@Test
public void deploymentProcessDefinition(){
Deployment deployment = processEngine.getRepositoryService() //用于流程定義和部署相關(guān)對象的Service
.createDeployment() //創(chuàng)建一個部署對象
.name("leaveBill部門程序")
.addClasspathResource("diagrams/LeaveBill.bpmn") //從ClassPath資源中加載,一次只能加載一個文件
.addClasspathResource("diagrams/LeaveBill.png") //從ClassPath資源中加載,一次只能加載一個文件
.deploy();
System.out.println("deployment" + deployment.getId()); //1
System.out.println("deployment" + deployment.getName());//部門程序
}
打印結(jié)果如下:
deployment1
deploymenthellworld部門程序
我們看一下數(shù)據(jù)庫的表會發(fā)現(xiàn),每次部署都是涉及的那三張表,act_re_deployment(流程部署表)
該表包含了流程部署的名稱,ID,和部署時間
act_re_procdef(流程定義表)
該表有流程定義的主鍵key,版本(version)源文件名和圖示,還有流程定義ID(key + 版本號+隨機生成的數(shù)字)
act_ge_bytearray(資源文件表)
保存了資源的位置和存儲方式和部署ID,版本號ID等信息
act_ge_property:主鍵生成策略表
定義了主鍵生成的策略信息
顧名思義,就是當(dāng)我們有一個人開始申請請假的時候我們就要執(zhí)行該請假的流程實例了
[java] view plain copy
/**
* 執(zhí)行流程實例
*/
@Test
public void startProcessInstance(){
String processInstanceKey = "LeaveBill";
ProcessInstance pi = processEngine.getRuntimeService()
.startProcessInstanceByKey(processInstanceKey);
System.out.println("流程實例id:" + pi.getId()); //流程實例id 101
System.out.println("流程定義id:" + pi.getProcessDefinitionId()); //流程定義ID helloworld:1:4
}
這樣我們的流程實例就啟動起來了,那么接下來我們看一下在啟動流程實例的時候我們涉及到的表信息
act_ru_execution: 正在執(zhí)行的執(zhí)行對象表,側(cè)重流程實例,對象,任務(wù)
包含了實例ID,流程定義ID,要執(zhí)行的任務(wù)名稱(usertask1)等信息
act_ru_task:正在執(zhí)行的任務(wù)表,對具體的任務(wù)而言,任務(wù)執(zhí)行到哪里了
act_ru_identitylink流程信息變量act_hi_taskinst:已經(jīng)執(zhí)行完的歷史任務(wù)信息
act_hi_taskinst:已經(jīng)執(zhí)行完的歷史任務(wù)信息
act_hi_procinst:流程實例的歷史表,存放執(zhí)行完畢的流程實例信息
act_hi_actinst:存放歷史所有完成的活動
現(xiàn)在我們對表有一個大致的了解,那么接下來我們就按照我們既定的流程去執(zhí)行我們的請假,例如第一個項目經(jīng)理叫張三,那么這個流程實例已啟動,首先需要張三去執(zhí)行操作,那么我們我們看一下張三的執(zhí)行任務(wù)的詳情,代碼如下:
[java] view plain copy
/**
* 查找個人當(dāng)前的要執(zhí)行的任務(wù)
*/
@Test
public void findMyTaskInfo(){
String assignee = "張三";
List<Task> listTask = processEngine.getTaskService()
.createTaskQuery()
.taskAssignee(assignee)
.list();
if (listTask!= null && listTask.size() >0) {
for (Task task : listTask) {
System.out.println("任務(wù)ID:" + task.getId());
System.out.println("任務(wù)名稱:" + task.getName());
System.out.println("任務(wù)時間:" + task.getCreateTime());
System.out.println("任務(wù)的班里人:" + task.getAssignee());
System.out.println("任務(wù)的實例ID:" + task.getProcessDefinitionId());
System.out.println("執(zhí)行對象的ID:" + task.getExecutionId());
System.out.println("任務(wù)的班里人:" + task.getAssignee());
System.out.println("流程定義ID:" + task.getProcessInstanceId());
}
}
}
打印信息如下:任務(wù)ID:304,任務(wù)名稱:【項目經(jīng)理】審批,任務(wù)時間:Sat Jan 23 14:54:35 CST 2016,任務(wù)的班里人:張三 任務(wù)的實例ID:LeaveBill:2:204 執(zhí)行對象的ID:301 任務(wù)的班里人:張三 流程定義ID:301
那么接下來我就把任務(wù)ID為304的一個流程結(jié)束,也就是項目經(jīng)理同意請假,代碼如下:
[java] view plain copy
/**完成任務(wù)*/
@Test
public void completeMyPersoinTask() {
String taskId = "304";
processEngine.getTaskService()
.complete(taskId);
System.out.println("完成任務(wù),任務(wù)ID:" + taskId);
}
然后我繼續(xù)執(zhí)行查詢個人任務(wù)的時候,我們只能查到主任的任務(wù)了,因為項目經(jīng)理已經(jīng)執(zhí)行完畢,所以當(dāng)前執(zhí)行的任務(wù)是看不到的,但是在歷史信息中是存在的。
如果我們啟動了實例的話,查詢當(dāng)前信息的話,實在act_ru_*的表中查詢,根據(jù)任務(wù)有關(guān)的服務(wù),都是taskService,當(dāng)然Activiti還有很多的服務(wù),例如RepositoryService,RuntimeService, HistoryService等服務(wù)。
大致總結(jié)一下,就是先部署,再啟動,個人登陸系統(tǒng)后,根據(jù)個人姓名,查到任務(wù)ID,完成個人任務(wù),直到全部完成
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。