1. 程式人生 > >JBoss 系列六十一:深入理解 jBPM Human Task

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 的生命週期如下:
  1. Task被建立,一開始狀態為'created'
  2. Task狀態通常會自動轉變為'Ready',該狀態的Task會在Task列表中,可以被使用者請求
  3. Task被使用者請求,狀態變為'Reserved'
  4. Task被使用者開始,狀態變為'InProgress'
  5. 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) 將指定的文件添加行號標註後寫到標準輸出。如果不指定文件或指定文件為"-" ,程序將從標準輸入讀取數據。