JBPM學習(六):詳解流程圖
最近發現這篇文章挺多人看的,也挺多人有疑問,我很想幫你們解答,但是很無奈,這篇文章只是我當時在自學時看的一個教程的記錄,當時對JBPM也沒有深入去學習,並且到現在也已經快4年了,這期間我都沒用過JBPM,因此JBPM的東西我也忘得差不多了。慶幸的是我把當時看的教程儲存了下來,因此如果對此文章有疑問的可以直接看我下面連結的教程。另外,通過我分享的視訊大家也能看到這是一個OA教程,我當時剛入門自學Java時就看過這個教程,我自己覺得是一個很不錯的教程,特別適合新手,因此如果你想要關於這個OA教程的其他內容,可以在文章下面留下你的郵箱或者私信我,我看到後會把教程連結發給你。
作者更新於2018-02-10
工作流視訊教程:連結:https://pan.baidu.com/s/1bqf6kaz 密碼:thlt
概念:
流程圖的組成:
a. 活動 Activity / 節點 Node
b. 流轉 Transition / 連線(單向箭頭)
c. 事件
1.流轉(Transition)
a) 一般情況一個活動中可以指定一個或多個Transition
i. 開始活動(Start)中只能有一個Transition。
ii. 結束活動(End)中沒有Transition。
iii. 其他活動中有一條或多條Transition
b) 如果Transition只有一個,則可以不指定名稱(名稱是null);如果有多個,則要分別指定唯一的名稱。
2.活動(Activity)
a) 流轉控制活動(預定義活動)
i. start開始活動
代表流程的開始邊界,一個流程有且只能有一個Start活動。開始活動只能指定一個Transition。在流程例項啟動後,會 自動的使用這個唯一的Transition離開開始活動,到一下個活動。
ii. end/end-error/end-cancel(結束活動)
代表流程的結束邊界,可以有多個,也可以沒有。如果有多個,則到達任一個結束活動,整個流程就都結束了;如果沒 有,則到達最後那個沒有Transition的活動,流程就結束了。
iii. state狀態活動
作用:等待。可以使用signal使其結束等待,並向後執行一步。
iv. task任務活動
-->
個人任務的分配1. 使用流程變數:assignee="#{manager}"
2. AssignmentHandler:assignable.setAssignee(userId); // 指定當前任務的辦理人(分配任務)
a) 需要在.jbdl.xml的<task>元素中寫
<assignment-handler class="cn.grace.AssignmentHandlerImpl"/>
b) 指定的AssignmentHandlerImpl類要實現AssignmentHandler介面
c) 在AssignmentHandlerImpl類中可以使用assignable.setAssignee(userId),分配個人任務。
3. TaskService.assignTask(taskId, userId)// 把指定的任務分配給指定的人
processEngine.getTaskService().assignTask(taskId, userId);
-->組任務的分配
1. 使用流程變數:assignee="#{userIdsString}" // 要是String型的變數,多個候選人之前用','隔開
2. AssignmentHandler:assignable.addCandidateUser(userId);// 新增組任務的候選人
a) 需要在.jbdl.xml的<task>元素中寫
<assignment-handler class="cn.grace.GroupTaskAssignmentHandlerImpl"/>
b) 指定的AssignmentHandlerImpl類要實現AssignmentHandler介面
c) 在AssignmentHandlerImpl類中可以使用assignable.addCandidateUser(userId),新增組任務候選人。
3. TaskService.addTaskParticipatingUser(taskId,userId,Participation.CANDIDATE);//新增組任務的候選人
v. Decision判斷活動
1. 使用expression,如:expr="#{'to state2'}"
2. 使用Handler,在Handler Class裡配置指定的DecisionHandlerImpl類的路徑
DecisionHandlerImpl.java
public class DecisionHandlerImpl implements DecisionHandler { // 計算離開當前節點用的Transition的名稱並返回 @Override public String decide(OpenExecution execution) { System.out.println("DecisionHandlerImpl.decide()"); // 獲取業務資料 Integer days = (Integer) execution.getVariable("請假天數"); // 選擇Transition if (days > 7) { return "to 總經理審批"; } else { return "to end1"; } } }
ProcessTest.java
@Test public void test() { // 1,部署流程定義 InputStream in = this.getClass().getResourceAsStream("test.jpdl.xml"); // 當前類所在包中的檔案 processEngine.getRepositoryService()// .createDeployment()// .addResourceFromInputStream("test.jpdl.xml", in)// .deploy(); // 2,啟動流程例項 Map<String, Object> variables = new HashMap<String, Object>(); // variables.put("請假天數", 10);啟動流程例項後,進行到to 總經理審批環節。 variables.put("請假天數", 3);//啟動流程例項後,進行到to end1環節。 ProcessInstance pi = processEngine.getExecutionService().startProcessInstanceByKey("test", variables); }
此時,如果variables.put("請假天數", 3);啟動流程例項後,進行到to end1環節。
此時,如果variables.put("請假天數", 10);啟動流程例項後,進行到to 總經理審批環節。
3. 如果同時配置了expression與Handler,則expression有效,忽略Handler。
vi. fork、join分支/聚合活動
public class ProcessTest { private ProcessEngine processEngine = Configuration.getProcessEngine(); @Test public void test() { // 1,部署流程定義 InputStream in = this.getClass().getResourceAsStream("test.jpdl.xml"); // 當前類所在包中的檔案 processEngine.getRepositoryService()// .createDeployment()// .addResourceFromInputStream("test.jpdl.xml", in)// .deploy(); // 2,啟動流程例項 ProcessInstance pi = processEngine.getExecutionService().startProcessInstanceByKey("test"); System.out.println("processInstanceId = " + pi.getId()); System.out.println("當前正在執行的活動:" + pi.findActiveActivityNames()); } }
輸出結果為:
processInstanceId = test.330007
當前正在執行的活動:[匯款, 發貨]
可以看出,匯款和發貨同時執行中。並且,只有當2條路線都到join活動,流程才會繼續往後執行。
b) 自定義活動(custom)
i. 在<custom>元素中指定class屬性為指定的類ExternalActivityBehaviourImpl
ii. 這個類要實現ExternalActivityBehaviour介面,其中有兩個方法:
1. execute(ActivityExecution):節點的功能程式碼
2. signal(ActivityExecution, String, Map):在當前節點等待時,外部發訊號時的行為
3. 在execute()方法中,可以呼叫以下方法對流程進行控制
a) ActivityExecution.waitForSignal():在當前節點等待。
b) ActivityExecution.takeDefaultTransition():使用預設的Transition離開,當前節點中定義的第一個為預設的。
c) ActivityExecution.take(String transitionName):使用指定的Transition離開
d) ActivityExecution.end():結束流程例項
4. 也可以實現ActivityBehaviour介面,只有一個方法execute(ActivityExecution),這樣就不能等待,否則signal時會有類轉換異常。
public class ExternalActivityBehaviourImpl implements ExternalActivityBehaviour { // 到達這個活動時執行的方法 @Override public void execute(ActivityExecution execution) throws Exception { System.out.println("已傳送資訊.");//此處寫自己要執行的事件 // 預設是執行完程式碼後離開當前活動,不會執行signal方法,也可以寫如下程式碼 // execution.takeDefaultTransition(); // 離開當前活動 // // 使用指定名稱的Transition離開當前活動 // execution.take(transitionName); // 執行完後不要離開,而是要等待外部呼叫signal()方法時才離開 execution.waitForSignal(); } // 呼叫signal()方法離開當前節點前執行的方法(如果在execute()中直接離開當前節點了,這個方法就不會被執行) @Override public void signal(ActivityExecution execution, String signalName, Map<String, ?> parameters) throws Exception { System.out.println("ExternalActivityBehaviourImpl.signal()"); } }
3.事件
a) 在根元素中,或在節點元素中,使用<on event="">元素指定事件,其中event屬性代表事件的型別。
b) 在<on>中用子元素<event-listener class="EventListenerImpl" />,指定處理的類,要求指定的類要實現EventListener介面
c) 事件型別:
i. <on>元素放在根元素(<process>)中,可以指定event為start或end,表示流程的開始與結束。
ii. <on>元素放在節點元素中,可以指定event為start或end,表示節點的進入與離開
iii. 在Start節點中只有end事件,在End節點中只有start事件。
iv. 在<transition>元素中直接寫<event-listener class="">,就是配置事件。(因為在這裡只有一個事件,所以不用寫on與型別)
v. 在<task>元素中還可以配置assign事件,是在分配任務時觸發的。
<?xml version="1.0" encoding="UTF-8"?> <process name="test" xmlns="http://jbpm.org/4.4/jpdl"> <!-- 流程例項的啟動事件 --> <on event="start"> <event-listener class="cn.grace.EventListenerImpl"></event-listener> </on> <!-- 流程例項的結束事件 --> <on event="end"> <event-listener class="cn.grace.EventListenerImpl"></event-listener> </on> <start name="start1" g="86,69,7,1"> <!-- 開始活動中只有離開活動的事件 --> <on event="end"> <event-listener class="cn.grace.EventListenerImpl"></event-listener> </on> <transition name="to task1" to="task1" g="-53,-17" /> </start> <task name="task1" g="61,171,92,52" assignee="張三"> <!-- 進入活動的事件 --> <on event="start"> <event-listener class="cn.grace.EventListenerImpl"></event-listener> </on> <!--離開活動的事件 --> <on event="end"> <event-listener class="cn.grace.EventListenerImpl"></event-listener> </on> <transition name="to end1" to="end1" g="-47,-17" /> </task> <end name="end1" g="86,272,48,48"> <!-- 結束活動中只有進入活動的事件 --> <on event="start"> <event-listener class="cn.grace.EventListenerImpl"></event-listener> </on> </end> </process>
根據上述.jpdl.xml和對應的.png圖,啟動流程例項會執行3次EventListenerImpl事件,結束流程例項也會執行3次EventListenerImpl事件。
相關推薦
JBPM學習(六):詳解流程圖
最近發現這篇文章挺多人看的,也挺多人有疑問,我很想幫你們解答,但是很無奈,這篇文章只是我當時在自學時看的一個教程的記錄,當時對JBPM也沒有深入去學習,並且到現在也已經快4年了,這期間我都沒用過JBPM
mongo 3.4分片集群系列之六:詳解配置數據庫
初始化 kpi 更新 並且 color tag 成員 gin sha 這個系列大致想跟大家分享以下篇章(我會持續更新的↖(^ω^)↗): 1、mongo 3.4分片集群系列之一:淺談分片集群 2、mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3、mongo
深度學習入門:詳解 Ubuntu 下 PaddlePaddle 原始碼編譯安裝
PaddlePaddle 是百度開源的一個深度學習框架,Paddle 提供的 Paddle book 對於那些深度學習入門的人簡直再方便不過。 想用 Paddle 進行模型訓練必然先進行安裝,這篇文章主要詳細的記錄一下 Paddle cpu 和 gpu 的原始碼編譯安裝。 個人認為原始
postman(六):詳解在Pre-request Script中如何執行請求
上一篇藉著如何在不同介面之間傳遞資料簡單說了下如何在postman編寫指令碼來發送請求,這裡再詳細介紹一下如何在Pre-request Script和Tests標籤中編寫指令碼來。因為我目前研究的也不是很深,對js也只是瞭解一點皮毛,所以大部分還是依賴postman已經封裝好的方法來介紹 這裡以P
Memcached學習筆記之三:詳解MemCached原理
memcached是一個高效能的分散式記憶體快取伺服器,memcached在Linux上可以通過yum命令安裝,這樣方便很多,在生產環境下建議用Linux系統,memcached使用libevent這個庫在Linux系統上才能發揮它的高效能。它的分散式其實在服務端是不具有分散式的特徵的,是依靠客戶端
深度學習 --- BP演算法詳解(流程圖、BP主要功能、BP演算法的侷限性)
上一節我們詳細推倒了BP演算法的來龍去脈,請把原理一定要搞懂,不懂的請好好理解BP演算法詳解,我們下面就直接把上一節推匯出的權值調整公式拿過來,然後給出程式流程圖,該流程圖是嚴格按照上一節的權值更新過程寫出的,因此稱為標準的BP演算法,標準的BP演算法中,每輸入一個樣本,都要回傳誤差並調整權值,
分享《TensorFlow學習指南:深度學習系統構建詳解》英文PDF+原始碼+部分中文PDF
下載:https://pan.baidu.com/s/1v4B-Jp-lQClBWiCfDd1_dw 更多分享:http://blog.51cto.com/14050756 《TensorFlow學習指南:深度學習系統構建詳解》英文PDF+原始碼+部分中文PDF英文完整版PDF,242頁,帶目錄書籤,彩色
《TensorFlow學習指南:深度學習系統構建詳解》英文PDF+原始碼+部分中文PDF
下載:https://pan.baidu.com/s/1v4B-Jp-lQClBWiCfDd1_dw 更多資料:https://pan.baidu.com/s/1g4hv05UZ_w92uh9NNNkCaA 《TensorFlow學習指南:深度學習系統構建詳解》英文PDF+原始碼+部分中文PDF英文完整版
分享《TensorFlow學習指南:深度學習系統構建詳解》英文PDF+源代碼+部分中文PDF
size 分布式 部署 模型 -o 卷積神經網絡 ref ima 源代碼 下載:https://pan.baidu.com/s/1v4B-Jp-lQClBWiCfDd1_dw 更多分享:http://blog.51cto.com/14050756 《TensorFlow學習
TensorFlow 學習指南:深度學習系統構建詳解
內容簡介 面向廣泛的技術受眾(從資料科學家、工程師到學生和研究人員),本書介紹了 TensorFlow 的基本原理和實踐方法。從 TensorFlow 中的一些基本示例開始,深入探討諸如神經網路體系結構、TensorBoard 視覺化、TensorFlow 抽象庫和多執行緒輸入管道等主題。閱讀本書
機器學習演算法二:詳解Boosting系列演算法一Adaboost
本文主要介紹boosting演算法得基本原理,以及的三種典型演算法原理:adaboost,GBM(Gradient bossting machine),XGBoost。 Boosting方法原理 boosting演算法是一類將弱學習器提升為強學習器的整合學習
pytorch學習筆記(十二):詳解 Module 類
Module 是 pytorch 提供的一個基類,每次我們要 搭建 自己的神經網路的時候都要繼承這個類,繼承這個類會使得我們 搭建網路的過程變得異常簡單。 本文主要關注 Module 類的內部是怎麼樣
斯坦福大學(吳恩達) 機器學習課後習題詳解 第六週 程式設計題 正則化線性迴歸以及方差與偏差
作業下載地址:https://download.csdn.net/download/wwangfabei1989/103031341. 正則化線性迴歸代價函式 linearRegCostFunctionfunction [J, grad] = linearRegCostFun
ASP.NET Core MVC 原始碼學習:詳解 Action 的匹配
前言 在 上一篇 文章中,我們已經學習了 ASP.NET Core MVC 的啟動流程,那麼 MVC 在啟動了之後,當請求到達過來的時候,它是怎麼樣處理的呢? 又是怎麼樣把我們的請求準確的傳達到我們的 Action 上呢? 那麼,在這邊文章中,我們一起跟蹤原始碼看一下
docker學習(3)--Dockfile詳解
基於 環境 設置 多個 詳解 連接 當前 true truct 轉載請註明出處:http://www.cnblogs.com/lighten/p/6900556.html 1.基本說明 Dockfile是一個用於編寫docker鏡像生成過程的文件,其有特定的語法。在
u-boot學習(六):自己寫bootloader
include trie depth params tee tboot config initrd passing 依照前面分析的u-boot的啟動流程,自己寫一個簡單的Bootloader。這是參考韋東山老師的視頻寫的。 1、初始化硬件:關看門狗、設置時鐘、設置SDR
OpenCV探索之路(十三):詳解掩膜mask
ret 如果 拷貝 ace 設置 之路 動作 與運算 區域 在OpenCV中我們經常會遇到一個名字:Mask(掩膜)。很多函數都使用到它,那麽這個Mask到底什麽呢? 一開始我接觸到Mask這個東西時,我還真是一頭霧水啊,也對無法理解Mask到底有什麽用。經過查閱大量資料後
Vue 進階教程之:詳解 v-model
com 方式 事件 變化 復習 簡寫 mage fine 需要 分享 Vue 官網教程上關於 v-model 的講解不是十分的詳細,寫這篇文章的目的就是詳細的剖析一下, 並介紹 Vue 2.2 v-model改進的地方,然後穿插的再說點 Vue 的小知識。 在 Vue 中,
mongo 3.4分片集群系列之五:詳解平衡器
大致 mongos 搭建 一次 相對 時間 表示 部分 man 這個系列大致想跟大家分享以下篇章(我會持續更新的↖(^ω^)↗): 1、mongo 3.4分片集群系列之一:淺談分片集群 2、mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3、mongo 3.4
Java:詳解內部類
進行 system 創建 經典 生成 接口 為什麽 bsp 產生 可以將一個類的定義放在另一個類的定義內部,這就是內部類。 內部類是一個非常有用的特性但又比較難理解使用的特性(鄙人到現在都沒有怎麽使用過內部類,對內部類也只是略知一二)。 第一次見面