JBoss 系列六十一:深入理解 jBPM Human Task
概述
Human Task 是BPM流程中的節點必需通過人為的手動操作才能夠執行。jBPM 5 通過 User Task(jBPM5示例之 User Task) 節點來支援Human Task。Human Task通常要求流程設計者在設計流程時指定流程執行相關的屬性,流程型別,流程的執行者,流程執行相關的資料。流程執行時我們根據這些屬性執行流程。
Human Task 是BPM核心,為什麼可以這樣說呢?一位BPM專家曾在某次BPM技術峰會上這樣定義BPM:“BPM is a blending of process management/workflow with application integration technology...to support rich human interaction and deep application connectivity”。注意他所表達BPM的目的或價值就是為複雜的企業應用提供廣泛的人為操作的可能性。
本文主要目的是通過實驗理解jBPM Human Task ,我們所需要的工具包括git,Maven,JBoss等,這些安裝可參照軟體安裝及資料下載。本文主要內容包括:
- 下載編譯jBPM Human Task 程式碼
- 部署jBPM Human Task 服務到JBoss
- jBPM Human Task 資料模型
- 通過TaskClient與Human Task 服務端互動
- Human Task的生命週期
下載編譯jBPM Human Task 程式碼
git clone --branch=5.2.x [email protected]:droolsjbpm/jbpm.git
克隆完成使用如下maven命令編譯jBPM 5.2.x程式碼:
mvn clean install -Dmaven.test.skip=true
如以上步驟沒有出現錯誤則該部分完成,我們需要如下編譯生成的包或Maven本地倉庫中的包來供我們使用:
- jbpm-human-task-war-5.2.6-SNAPSHOT-EE6.war - 位於jbpm-human-task-war/target目錄下
部署jBPM Human Task 服務到JBoss
本部分我們部署jbpm-human-task-war-5.2.6-SNAPSHOT-EE6.war到JBoss 7。具體參照使用4種方式部署應用到JBoss7/WildFly。
我們需要基於jbpm-human-task-war-5.2.6-SNAPSHOT-EE6.war做如下操作:
1. 重新命名
unzip jbpm-human-task-war-5.2.6-SNAPSHOT-EE6.war jbpm-human-task.war
2. 建立資料庫
jBPM Human Task執行過程需要儲存資料在資料庫中,我們本實驗使用mysql資料庫,我們使用如下SQL語句建立資料庫jbpm,jbpm_user用來操作資料庫jbpm,jbpm_user對應密碼jbpm_pass:
CREATE DATABASE jbpm;
create user 'jbpm_user'@'localhost' identified by 'jbpm_pass';
grant all on jbpm.* to [email protected]'localhost';
FLUSH PRIVILEGES;
3. 建立jbpmDS資料來源
使用JBoss 7/WildFly中配置使用Mysql資料庫中描述的方法建立資料來源jbpmDS指向上面步驟2建立的資料庫和使用者,資料來源如下:
<datasource jndi-name="java:jboss/datasources/jbpmDS" pool-name="jbpmPool">
<connection-url>jdbc:mysql://localhost:3306/jbpm</connection-url>
<driver>mysql</driver>
<security>
<user-name>jbpm_user</user-name>
<password>jbpm_pass</password>
</security>
</datasource>
4. 修改persistence.xml
修改jbpm-human-task.war/WEB-INF/classes/META-INF/persistence.xml檔案,配置hibernate.dialect屬性為org.hibernate.dialect.MySQL5Dialect,hibernate.show_sql屬性為true。
5. 更新hornetq-core-2.2.10.Final.jar
這一步是可選擇的,hornetq-core-2.2.10.Final.jar包存在Socket leak等不穩定問題,我建議升級此包。
6. 啟動JBoss
使用JBoss啟動指令碼./standalone.sh啟動JBoss,啟動完成後可以看到jbpm-human-task.war部署成功提示。我們會發現如下日誌資訊:
17:19:07,950 INFO [stdout] (ServerService Thread Pool -- 52) Task service startup completed successfully !
使用netstat命令,輸出所有埠使用情況:
[[email protected] lib]$ netstat -antulop | grep 13179
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 127.0.0.1:4447 0.0.0.0:* LISTEN 13179/java off (0.00/0/0)
tcp 0 0 127.0.0.1:5153 0.0.0.0:* LISTEN 13179/java off (0.00/0/0)
tcp 0 0 127.0.0.1:9990 0.0.0.0:* LISTEN 13179/java off (0.00/0/0)
tcp 0 0 127.0.0.1:9999 0.0.0.0:* LISTEN 13179/java off (0.00/0/0)
tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 13179/java off (0.00/0/0)
tcp 0 0 127.0.0.1:44186 127.0.0.1:5153 ESTABLISHED 13179/java keepalive (5695.77/0/0)
tcp 0 0 127.0.0.1:34368 127.0.0.1:3306 ESTABLISHED 13179/java keepalive (5695.77/0/0)
tcp 0 0 127.0.0.1:5153 127.0.0.1:44186 ESTABLISHED 13179/java keepalive (5695.77/0/0)
注意,5153為 Human Task Service在伺服器端監聽的埠。
jBPM Human Task 資料模型
上面一部分中,我們建立了空白的資料庫jbpm,jBPM使用JPA/Hobernate作為資料持久工具,當JBoss啟動成功後Hibernate會向資料庫jbpm建立表,我們在mysql管理端使用jbpm_user使用者登入後查看錶建立情況。
show tables輸出:
mysql> show tables;
+--------------------------------+
| Tables_in_jbpm |
+--------------------------------+
| Attachment |
| BooleanExpression |
| Content |
| Deadline |
| Delegation_delegates |
| Escalation |
| I18NText |
| Notification |
| Notification_BAs |
| Notification_Recipients |
| Notification_email_header |
| OrganizationalEntity |
| PeopleAssignments_BAs |
| PeopleAssignments_ExclOwners |
| PeopleAssignments_PotOwners |
| PeopleAssignments_Recipients |
| PeopleAssignments_Stakeholders |
| Reassignment |
| Reassignment_potentialOwners |
| SubTasksStrategy |
| Task |
| email_header |
| task_comment |
+--------------------------------+
23 rows in set (0.00 sec)
即jBPM執行Human Task所需要的表共23個。
我們在jbpm human task 原始碼分析 - I的org.jbpm.task.Task部分解釋了資料模型類,以上這些表是資料實體模型對應資料庫中表的對映。接下來的一個部分我們演示如何使用jBPM Human Task Service提供的介面對資料庫中的資料進行操作。
通過TaskClient與Human Task 服務端互動
在之前步驟的基礎上,本處我們通過TaskClient與Human Task 服務端互動,建立Task,開始Task,結束Task。
建立Task
TaskClient client = getTaskClientInstance();
client.connect();
Task task = newTask();
ContentData content = new ContentData();
BlockingAddTaskResponseHandler addTaskResponseHandler = new BlockingAddTaskResponseHandler();
client.addTask(task, content, addTaskResponseHandler );
long taskId = addTaskResponseHandler.getTaskId();
System.out.println("Add Task to human task service, taskId: " + taskId);
以Java Application的方式執行org.jbpm.conductor.humantask.TaskAdd輸出
Add Task to human task service, taskId: 1
在Mysql資料庫端通過SQL語句查詢得到如下結果:
mysql> select id, status, actualOwner_id, createdBy_id, activationTime from Task;
+----+----------+----------------+--------------+---------------------+
| id | status | actualOwner_id | createdBy_id | activationTime |
+----+----------+----------------+--------------+---------------------+
| 1 | Reserved | kylin | kylin | 2013-12-02 16:51:24 |
+----+----------+----------------+--------------+---------------------+
獲取Task
TaskClient client = getTaskClientInstance();
client.connect();
BlockingTaskSummaryResponseHandler taskSummaryResponseHandler = new BlockingTaskSummaryResponseHandler();
client.getTasksAssignedAsPotentialOwner("kylin", "en-UK", taskSummaryResponseHandler);
List<TaskSummary> tasks = taskSummaryResponseHandler.getResults();
System.out.println("Getting tasks for human task service via user kylin, tasks size: " + tasks.size());
以Java Application的方式執行org.jbpm.conductor.humantask.TaskGetting輸出
Getting tasks for human task service via user kylin, tasks size: 1
開始Task
TaskClient client = getTaskClientInstance();
client.connect();
BlockingTaskOperationResponseHandler responseHandler = new BlockingTaskOperationResponseHandler();
client.start(1, "kylin", responseHandler);
responseHandler.waitTillDone(1000);
System.out.println("kylin starting Task ");
以Java Application的方式執行org.jbpm.conductor.humantask.TaskStart輸出
kylin starting Task
在Mysql資料庫端通過SQL語句查詢得到如下結果:
mysql> select id, status, actualOwner_id, createdBy_id, activationTime from Task;
+----+------------+----------------+--------------+---------------------+
| id | status | actualOwner_id | createdBy_id | activationTime |
+----+------------+----------------+--------------+---------------------+
| 1 | InProgress | kylin | kylin | 2013-12-02 16:51:24 |
+----+------------+----------------+--------------+---------------------+
完成Task
TaskClient client = getTaskClientInstance();
client.connect();
ContentData content = new ContentData();
BlockingTaskOperationResponseHandler responseHandler = new BlockingTaskOperationResponseHandler();
client.complete(2, "kylin", content, responseHandler);
responseHandler.waitTillDone(1000);
System.out.println("kylin completing Task ");
以Java Application的方式執行org.jbpm.conductor.humantask.TaskComplete輸出
kylin completing Task
在Mysql資料庫端通過SQL語句查詢得到如下結果:
mysql> select id, status, actualOwner_id, createdBy_id, activationTime from Task;
+----+-----------+----------------+--------------+---------------------+
| id | status | actualOwner_id | createdBy_id | activationTime |
+----+-----------+----------------+--------------+---------------------+
| 1 | Completed | kylin | kylin | 2013-12-02 16:51:24 |
+----+-----------+----------------+--------------+---------------------+
另外我們還可以使用如下SQL在Mysql管理端進行管理查詢:
select DTYPE, id from OrganizationalEntity;
select id, language, text from I18NText;
Human Task的生命週期
當一個 Human Task 節點在流程執行過程中被啟用,一個人為參與的工作產生,流程只有在該人為參與的工作完成或取消後才離開該節點。
Human Task 的生命週期如下:- Task被建立,一開始狀態為'created'
- Task狀態通常會自動轉變為'Ready',該狀態的Task會在Task列表中,可以被使用者請求
- Task被使用者請求,狀態變為'Reserved'
- Task被使用者開始,狀態變為'InProgress'
- Task被使用者結束,狀態變成'Completed',如果使用者不能夠結束Task,會返回一個錯誤的結果,這樣Task狀態變成'Failed'
Next
相關推薦
JBoss 系列六十一:深入理解 jBPM Human Task
概述 Human Task 是BPM流程中的節點必需通過人為的手動操作才能夠執行。jBPM 5 通過 User Task(jBPM5示例之 User Task) 節點來支援Human Task。Human Task通常要求流程設計者在設計流程時指定流程執行相關的屬性,流程型
JBoss 系列八十一: jBPM 6 中使用 jbpm-console 建立執行 BPM 流程
概述 如jBPM 6 中使用 jbpm-console 建立執行 BPM 流程 - I中所示,我們在jbpm-console 上建立執行了簡單的BPM流程,本文在前文的基礎之上演示如何建立執行一個較複雜的流程,即流程開始和執行User Task時需要輸入資料。 建立流程 如
JBoss 系列七十一:jBPM 6 釋出,快速安裝,新功能介紹
概述 jBPM 6.0 最終版已與上月底釋出,本文主要從兩個方面去介紹jBPM 6.0 : 快速安裝新功能介紹 快速安裝 快速安裝包括如下三步: 下載安裝包 安裝 到jbpm-installer目錄下執行ant命令: ant install.demo ant命令執
Office 365 系列之十一:使用 Windows PowerShell 管理 O365 平臺
命令管理o365 命令管理office 365 正如之前我們說的,通過 O365 管理中心、Exchange 管理中心、Lync 管理中 心 SharePoint 管理中心能做的事情和能夠實現的需求是遠遠滿足不了客戶的時 間需求的。可以使用用於 Windows PowerShell 的 Azu
skyfans之每天一個Liunx命令系列之十一:htop
今天我們繼續來學習PERFORMANCE MONITORING AND STATISTICS(效能監測與統計),今天學習的是什麼命令呢,那就是htop(顯示管理程序內容相關資訊增強版),什麼叫增強版,那就是更漂亮了! 題外話:IG的S8比賽,這個命令是給予IG的希望,希望我更新完這章之後
Java程式設計師從笨鳥到菜鳥之(八十二)細談Spring(十一)深入理解spring+struts2整合(附原始碼)
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
Spring Boot系列教程十一: Mybatis使用分頁外掛PageHelper
一.前言 上篇部落格中介紹了spring boot整合mybatis的方法,基於上篇文章這裡主要介紹如何使用分頁外掛PageHelper。在MyBatis中提供了攔截器介面,我們可以使用PageHelp最為一個外掛裝入到SqlSessionFactory,實現攔截器功能。
微服務架構設計實踐系列之十一:物理架構
微服務架構設計實踐 目 次1 序言2 微服務4.4.5 物理架構4.4.5.1 物理架構定義 物理架構定義了“程式”如何對映(安裝、部署或燒寫等)到“硬體”,以及“資料“如何在”硬體“上儲存和傳遞。 物理架構必須考慮”功能的分佈“和”資料
JBoss 系列七十四:使用 BPMN2 Modeler 建立 jBPM 6 流程
概述 流程設計在BPM中佔很重要的地位,本文演示如何使用 BPMN2 Modeler 建立一個BPMN流程,並執行該流程,如前面 jBPM 6 開發 eclipse 外掛安裝中介紹的,外掛安裝完成BPMN2 Modeler已經安裝,更多關於BPMN2 Modeler參照:
JBoss 系列四十二:jBPM5示例之 Signal Event
在BPM流程中經常需要事件訊號,只有當流程中某訊號被觸發時,流程繼續執行,jBPM5中使用Signal Event來完成這一需求,如下為SignalEvent流程: 如圖,Signal Event節點Payment位於Gateway之前,我們通過Payment傳遞一個變數
問題六十一:三次b樣條(b-spline)曲線的控制點和曲線形狀的對應——以迴旋體的“基本曲線”為例
在這一章節,我們以其中一段曲線段為例,改變其對應的控制點,看看曲線段形狀的改變,同時也看看對應的迴旋體圖形的改變。 控制點座標如下圖: “問題六十”中的“基本曲線”的控制點對應如上ABCDEF六個點(其中A點在1位置)。對應輸出的迴旋體圖形如下(再次貼出來): 說
Mysql高手系列 - 第22篇:深入理解mysql索引原理,連載中
Mysql系列的目標是:通過這個系列從入門到全面掌握一個高階開發所需要的全部技能。 歡迎大家加我微信itsoku一起交流java、演算法、資料庫相關技術。 這是Mysql系列第22篇。 背景 使用mysql最多的就是查詢,我們迫切的希望mysql能查詢的更快一些,我們經常用到的查詢有: 按照id查詢唯一一條
深入理解Spring系列之十二:@Transactional是如何工作的
結合Spring框架,在進行資料庫操作的時候,經常使用@Transactional註解,工作經歷中看到很多開發者使用方式都是錯誤的,沒有深入理解過其原理,這是很危險的!!本篇將深入Spring原始碼,分析@Transactional註解的工作原理。相信,看完你會
spring boot 系列之六:深入理解spring boot的自動配置
我們知道,spring boot自動配置功能可以根據不同情況來決定spring配置應該用哪個,不應該用哪個,舉個例子: Spring的JdbcTemplate是不是在Classpath裡面?如果是,並且DataSource也存在,就自動配置一個JdbcTemplate的Bean Thymeleaf是不
SpringBoot系列十一:SpringBoot整合Restful架構(使用 RestTemplate 模版實現 Rest 服務調用、Swagger 集成、動態修改日誌級別)
attribute tar ring 動態修改 包含 分布式 restfu pen 負載 1、概念:SpringBoot整合Restful架構 2、背景 Spring 與 Restful 整合才是微架構的核心,雖然在整個 SpringBoot(SpringCloud)之中提
SpringCloud系列十一:SpringCloudStream(SpringCloudStream 簡介、創建消息生產者、創建消息消費者、自定義消息通道、分組與持久化、設置 RoutingKey)
javax sun 就是 eas nts discovery junit4 IE 程序包 1、概念:SpringCloudStream 2、具體內容 2.1、SpringCloudStream 簡介 SpringCloudStream 就是使用了基於消息系統的微服務處理架構
Python基礎筆記系列十一:標準輸入輸出、文件讀寫和指針等操作
mode strong sublime pre 字符串類型 類型 print語句 open 同時 本系列教程供個人學習筆記使用,如果您要瀏覽可能需要其它編程語言基礎(如C語言),why?因為我寫得爛啊,只有我自己看得懂!! 標準輸入輸出一、輸入 在sublime中這
Silverlight & Blend動畫設計系列十一:沿路徑動畫(Animation Along a Path)
幀動畫 -- long png ref wid found 不用 system.in 原文:Silverlight & Blend動畫設計系列十一:沿路徑動畫(Animation Along a Path) Silverlight 提供一個好的動畫基礎,但缺少一種
java基礎學習總結(十二):深入理解java內部類
內部類 內部類也是語法糖,是因為它僅僅是一個編譯時的概念,outer.java裡面定義了一個內部類inner,一旦編譯成功,就會生成兩個完全不同的.class檔案了,分別是outer.class和outer$inner.class。所以內部類的名字完全可以和它的外部類名字相同。 內部類分為四
linux系列(十一):nl命令
調整 寫到 實例 空行 格式 指定格式 指定 所有 tab 1、命令格式: nl [選項] [文件] 2、命令功能: nl(Number of Lines) 將指定的文件添加行號標註後寫到標準輸出。如果不指定文件或指定文件為"-" ,程序將從標準輸入讀取數據。