Activiti學習筆記六 流程例項 任務 執行物件控制流程執行
上一篇我們看了流程定義,我們接下來看一下流程例項,任務,和執行物件。
流程例項 任務的執行
1.流程圖
2.部署流程定義
private final ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); /** * 功能: 部署流程定義zip.<br/> * date: 2014年12月16日 下午2:09:03 <br/> * * @author [email protected] */ @Test public void deploymentProcessDefinitionByZip() { InputStream in = this.getClass().getClassLoader().getResourceAsStream("diagrams/helloworld.zip"); ZipInputStream zipInputStream = new ZipInputStream(in); Deployment deployment = processEngine.getRepositoryService() // 與流程定義和部署相關的Service .createDeployment() // 建立部署物件 .name("流程定義") // 部署名稱 .addZipInputStream(zipInputStream) // 指定zip檔案 .deploy(); // 部署 System.out.println("部署ID:" + deployment.getId()); System.out.println("部署名稱:" + deployment.getName()); }
3.啟動流程例項
/** * 功能: 啟動流程例項.<br/> * date: 2014年12月15日 下午5:25:37 <br/> * * @author [email protected] */ @Test public void startProcessInstance() { // 流程定義的key String processDefinitionKey = "helloworld"; ProcessInstance pi = processEngine.getRuntimeService()// 獲取正在執行的流程例項和執行物件相關的Service .startProcessInstanceByKey(processDefinitionKey); // 使用流程定義的key啟動流程例項 // key // 對應helloworld.bpmn中的Id屬性 System.out.println(pi.getId()); // 流程例項Id 601 System.out.println(pi.getProcessDefinitionId()); // 流程定義Id // helloworld:1:504 }
操作資料庫的act_ru_execution表,如果是使用者任務節點,同時也會在act_ru_task新增一條記錄
act_ru_execution #正在執行的執行物件表
執行物件ID 流程例項ID
act_hi_procinst #流程例項的歷史表執行物件ID 流程例項ID
結論 1.如果是單例流程(沒有分支和聚合),那麼流程例項ID和執行物件ID是相同的 2.一個流程流程例項只有一個,執行物件可以存在多個(如果存在分支和聚合) 注意:本例是單例流程,要想測試第二個結論,可以再畫一張有分支的流程圖來測試。4.查詢個人任務
/**
* 功能: 查詢當前人的個人任務.<br/>
* date: 2014年12月16日 上午11:00:46 <br/>
*
* @author [email protected]
*/
@Test
public void queryMyTask() {
String assignee = "李四";
List<Task> list = processEngine.getTaskService()// 獲取正在執行的任務相關的Service
.createTaskQuery()// 建立任務查詢物件
.taskAssignee(assignee)// 指定任務辦理人
// .taskCandidateUser(candidateUser) //組任務的辦理人查詢
// .processDefinitionId(processDefinitionId)//使用流程定義Id查詢
// .processInstanceId(processInstanceId) //使用流程例項Id查詢
// .executionId(executionId) //使用執行物件Id查詢
/** 排序 */
.orderByTaskCreateTime().asc() // 使用建立時間的升序
/** 返回結果集 */
// .singleResult()// 返回唯一結果集
// .count() // 返回結果集的數量
// .listPage(firstResult, maxResults)//分頁查詢
.list();
if (null != list && list.size() > 0) {
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());
System.out.println("################################");
}
}
}
說明:
1)因為是任務查詢,所以從processEngine中應該得到TaskService
2)使用TaskService獲取到任務查詢物件TaskQuery
3)為查詢物件新增查詢過濾條件,使用taskAssignee指定任務的辦理者(即查詢指定使用者的代辦任務),同時可以新增分頁排序等過濾條件
4)呼叫list方法執行查詢,返回辦理者為指定使用者的任務列表
5)任務ID、名稱、辦理人、建立時間可以從act_ru_task表中查到
6)單例流程中ProcessInstance相當於Execution
7)如果assignee屬性為部門經理,結果為空。因為現在流程只到了”填寫請假申請”階段,後面的任務還沒有執行,即在資料庫中沒有部門經理可以辦理的任務,所以查詢不到
8)一個Task節點和Execution節點是1對1的情況,在task物件中使用Execution_來表示他們之間的關係
9)任務ID在資料庫表act_ru_task中對應“ID_”列
附加:
在activiti任務中,主要分為兩大類查詢任務(個人任務和組任務):
1.確切指定了辦理者的任務,這個任務將成為指定者的私有任務,即個人任務。
2.無法指定具體的某一個人來辦理的任務,可以把任務分配給幾個人或者一到多個小組,讓這個範圍內的使用者可以選擇性(如有空餘時間時)來辦理這類任務,即組任務。
act_ru_task #正在執行的任務表
任務ID 執行物件ID 流程例項ID
act_hi_taskinst #任務歷史表
辦理人 開始時間 結束時間
act_hi_actinst #所有活動節點的歷史表
5.辦理任務
/**
* 功能: 完成任務.<br/>
* date: 2014年12月17日 下午5:24:44 <br/>
*
* @author [email protected]
*/
@Test
public void completeMyTask() {
String taskId = "1402";
processEngine.getTaskService()// 獲取任務相關Service
.complete(taskId);
System.out.println("完成任務:任務ID:" + taskId);
}
說明:
1)是辦理任務,所以從ProcessEngine得到的是TaskService
2)當執行完這段程式碼,再以員工的身份去執行查詢的時候,會發現這個時候已經沒有資料了,因為正在執行的任務中沒有資料
3)對於執行完的任務,activiti將從act_ru_task表中刪除該任務,下一個任務會被插入進來
4)以”部門經理”的身份進行查詢,可以查到結果。因為流程執行到部門經理審批這個節點了
5)再執行辦理任務程式碼,執行完以後以”部門經理”身份進行查詢,沒有結果、
6)重複第3和4步直到流程執行完
6.查詢流程狀態
/**
* 功能: 查詢流程狀態(判斷流程正在執行,還是結束).<br/>
* date: 2014年12月22日 下午3:52:22 <br/>
*
* @author [email protected]
*/
@Test
public void isProcessEnd() {
String processInstanceId = "1201";
ProcessInstance pi = processEngine.getRuntimeService()// 正在執行的流程例項和執行物件相關Service
.createProcessInstanceQuery() // 建立流程例項查詢
.processInstanceId(processInstanceId) // 使用流程例項ID查詢
.singleResult();
if (null == pi) {
System.out.println("流程已經結束!");
} else {
System.out.println("流程正在執行!");
}
}
在流程執行的過程中,建立的流程例項ID在整個過程中都不會變,當流程結束後,流程例項將會在正在執行的執行物件表中(act_ru_execution)被刪除
說明:
1)因為是查詢流程例項,所以先獲取runtimeService
2)建立流程例項查詢物件,設定例項ID過濾引數
3)由於一個流程例項ID只對應一個例項,使用singleResult執行查詢返回一個唯一的結果,如果結果數量大於1,則丟擲異常
4)判斷指定ID的例項是否存在,如果結果為空,則代表流程結束,例項在正在執行的執行物件表中已被刪除,轉換成歷史資料
7.查詢歷史任務
/**
* 功能: 查詢歷史任務.<br/>
* date: 2014年12月22日 下午4:15:55 <br/>
*
* @author [email protected]
*/
@Test
public void findHistoryTask() {
String taskAssignee = "張三";
List<HistoricTaskInstance> list = processEngine.getHistoryService()// 與歷史資料相關的Service
.createHistoricTaskInstanceQuery() // 建立歷史任務例項查詢
.taskAssignee(taskAssignee) // 指定辦理人
.list();
if (null != list && list.size() > 0) {
for (HistoricTaskInstance hist : list) {
System.out.println(hist.getId() + " " + hist.getName() + " " + hist.getProcessInstanceId() + " "
+ hist.getStartTime());
System.out.println("#########################");
}
}
}
8.查詢歷史流程例項
/**
* 功能: 查詢歷史流程例項.<br/>
* date: 2014年12月22日 下午4:25:13 <br/>
*
* @author [email protected]
*/
@Test
public void findHistoryProcessInstance() {
String processInstanceId = "1201";
HistoricProcessInstance hpi = processEngine.getHistoryService()// 與歷史資料相關的Service
.createHistoricProcessInstanceQuery() // 建立歷史流程例項查詢
.processInstanceId(processInstanceId) // 使用流程例項Id查詢
.singleResult();
System.out.println(hpi.getId() + " " + hpi.getProcessDefinitionId() + " " + hpi.getStartTime() + " "
+ hpi.getEndTime());
}
總結:
按流程定義的規則執行一次的過程.
對應的表:
act_ru_execution:正在執行的資訊
act_hi_procinst:已經執行完的歷史流程例項資訊
act_hi_actinst:存放歷史所有完成的活動
ProcessInstance 流程例項
特指流程從開始到結束的那個最大的執行分支,一個執行的流程中,流程例項只有1個。
注意
(1)如果是單例流程,執行物件ID就是流程例項ID
(2)如果一個流程有分支和聚合,那麼執行物件ID和流程例項ID就不相同
(3)一個流程中,流程例項只有1個,執行物件可以存在多個
Task任務
執行到某任務環節時生成的任務資訊
對應的表:
act_ru_task:正在執行的任務資訊
act_hi_taskinst:已經執行完的歷史任務資訊
相關推薦
Activiti學習筆記六 流程例項 任務 執行物件控制流程執行
上一篇我們看了流程定義,我們接下來看一下流程例項,任務,和執行物件。 流程例項 任務的執行 1.流程圖 2.部署流程定義 private final ProcessEngine processEngine = ProcessEngines.getDefaultP
【Activiti工作流】8.流程例項,任務,執行物件控制流程的執行
我們之前講過了流程的定義,啟動,檢視和刪除,以及升級版本,接下來當流程 正式啟動成功之後,我們就要學習流程例項/任務的執行了。 1,流程例項/任務的執行 (1)啟動流程例項 (這裡前提是大家部署好了流程)/** * 啟動流程 * 當流程到達一個節點時,會在act_ru_
工作流4-流程例項,任務,執行物件控制流程的執行
流程例項: 從開始到結束 流程物件: 一個流程,流程例項只有一個,執行物件可以存在多個 1.啟動流程例項 public void startProcessInstance(){ //流程定義的key,根據key啟動最新version流程 String pr
Maven學習筆記(六)-使用Eclipse建立Maven WEB專案以及執行專案的幾種方式
一、建立一個專案 在eclipse選單欄中選擇“File”---“News”---“Other”選單項,就會開啟如下對話視窗,在視窗中選擇“Maven”節點下“Maven Project”條目,如下
Activiti學習筆記(六)Activiti的流程引擎API和服務
引擎API是與Activiti互動的最常見方式。中心起點是ProcessEngine,可以通過多種方式建立,如《Activiti學習筆記(三)獲取ProcessEngine物件的多種方式》。 從ProcessEngine中,可以獲得包含工作流BPM方法的各種服務。一下是Activiti的模型圖 一共有
Java多執行緒學習筆記(六) synchronized(this)同步語句塊
synchronized (this)同步語句塊 1. 一半非同步,一半同步 1.1 Task 1.2 ThreadA 1.3 ThreadB 1.4 Test 1.5 執行結果 2. synchronize
大資料技術學習筆記之Hadoop框架基礎2-MapReduce程式設計及執行流程
一、回顧 -》hadoop的功能? -》海量資料儲存和海量計算問題 -》分散式檔案儲存框架hdfs和
多執行緒學習筆記六之併發工具類CountDownLatch和CyclicBarrier
目錄 簡介 CountDownLatch 示例 實現分析 CountDownLatch與Thread.join() CyclicBarrier 實現分析 CountDownLatch和CyclicBarrier區別 簡介
rocketmq學習筆記 六 流程之存訊息
private RemotingCommand sendMessage(final ChannelHandlerContext ctx, // final RemotingCommand request, //
rocketmq學習筆記 六 流程之取訊息
前面一章學習了,客戶端拉訊息的流程,那麼broker端得到RemotingCommand 之後怎麼操作呢? 請聽本文的分析 流程圖 核心程式碼 PullMessageProcessor private RemotingCommand processReques
linux多執行緒學習筆記六--一次性初始化和執行緒私有資料
pthread_key_t key; int pthread_key_create(pthread_key *key,void (*destructor)(void*)); int pthread_key_delete(pthread_key_t key); 該函式從TSD池中分配一項,將其值賦給key供以
Activiti 學習筆記13:分配組任務
一、流程圖 二、分配組任務方式一(直接指定辦理人) 1:流程圖中任務節點的配置 2:測試程式碼 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
Caffe學習筆記(六):mnist手寫數字識別訓練例項
一、前言 深度學習的一個簡單例項就是mnist手寫數字識別,只要這個例子弄明白,其它的內容就可以舉一反三了。之前的內容如有遺忘,可以進行回顧。 二、準備資料 資料集可以直接從我的github下載,包括資料集和程式碼,使用如下指令:
JAVA學習筆記(六十)- 網路程式設計登入例項
客戶端 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import ja
Activiti 學習筆記五:流程變數
流程變數在整個工作流中扮演很重要的作用。例如:請假流程中有請假天數、請假原因等一些引數都為流程變數的範圍。流程變數的作用域範圍是只對應一個流程例項。也就是說各個流程例項的流程變數是不相互影響的。流程例項
吳裕雄--天生自然python學習筆記:python通過“任務計劃程式”實現定時自動下載或更新執行 PM2.5 資料抓取程式資料
在 Windows 任務計劃程式中,設定每隔 30 分鐘自動抓取 PM2.5 資料,井儲存 在 SQLite 資料庫中 。 import sqlite3,ast,requests,os from bs4 import BeautifulSoup #cur_path=os
Python學習筆記六:文件處理
alt 筆記 lin 系統 顯式 當前位置 open 刷新 大小 一:打開文件 open(name,mode,[bufferSize]) name:文件路徑 mode:文件打開方式 二:文件讀取 read()方法:可以一次讀取文件的全部內容,Python把內容讀到
Android第一行代碼學習筆記六---Intent向活動傳遞數據
一行 而已 activity ase 是否 button can ride 重載 @1、向下一個活動傳遞數據: Intent提供了一系列putExtra()方法的重載,可以把我們想要傳遞的數據暫存在Intent中,啟動了另一個活動後,只需把這些數據再從Intent中取出就可
activiti學習筆記---常見異常
exce 方法 ons 版本 med 不存在 code ssl cloc Activiti中的基礎異常為org.activiti.engine.ActivitiException,一個非檢查異常, 這個異常可以在任何時候被API拋出。 為了避免過多的異常繼承,下面的子類用於
<Bootstrap> 學習筆記六. 柵格系統使用案例
柵格 3.2 btn nta head ext ont ces str <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <t