1. 程式人生 > >JBPM學習(六):詳解流程圖

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. AssignmentHandlerassignable.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. AssignmentHandlerassignable.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. 如果同時配置了expressionHandler,則expression有效,忽略Handler

vi. forkjoin分支/聚合活動

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>)中,可以指定eventstartend,表示流程的開始與結束。

ii. <on>元素放在節點元素中,可以指定eventstartend,表示節點的進入與離開

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圖,啟動流程例項會執行3EventListenerImpl事件,結束流程例項也會執行3EventListenerImpl事件。

相關推薦

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 產生 可以將一個類的定義放在另一個類的定義內部,這就是內部類。 內部類是一個非常有用的特性但又比較難理解使用的特性(鄙人到現在都沒有怎麽使用過內部類,對內部類也只是略知一二)。 第一次見面