jbpm 工作流引擎

转载 2006年05月18日 11:12:00
安裝需求:
         jdk-1.5.0_4 ---------- http://java.sun.com/j2se/1.5.0/download.jsp
         jbpm starters kit with eclipse 3.0 for Windows  ---------- http://sourceforge.net/projects/jbpm/
                   內涵:
jbpm (version 3.0), jbpm-bpel, jbpm-db(with HSQL), jbpm-designer(with Eclipse 3.0),
jbpm-server(with Jboss)
         實際上亦可下載 jbpm Eclipse 3.0 獨立的版本
                   Jboss jBPM ---------- 最基本的 jBPM, 版本為 3.0.1
                   Jboss jBPM Starters kit ---------- JBoss jBPM Starters Kit With Eclipse for
                                                                           Windows ㄧ樣但是少了 Eclipse
                   JBoss jBPM Process Designer Plugin ---------- 若不是下載 starters kit, Eclipse 中要
   加入此 plugin 才能使用 Process
   Definition 圖形介面。
                            下載頁:http://www.jboss.com/products/jbpm/downloads
                  Eclipse 3.0 ---------- http://www.eclipse.org/downloads/index.php
         jbpm 3.0 當中已備有一個架構在記憶體上的資料庫 HSQL, 供測試用。
         實際應用上我們在介紹中使用 PostgresSQL, 這個資料庫系統提供資料在硬碟上的存取。 
postgresql-8.0.3 ---------- http://www.postgresql.org/download/
         postgresql-8.0-312.jdbc3 ---------- http://jdbc.postgresql.org/download.html
 
執行需求:
         本介紹以 Eclipse editor
        
1.             
l           jdk-1.5.0_4 安裝後, 設定環境變數 %JAVA_HOME% 於安裝位置(for Windows)
l           jdk-1.5.0_4 安裝後, 設定環境變數
                                             i.                Forsh / bashexportJAVA_HOME/安裝位置
                                            ii.                Fortch / tcshsetenvJAVA_HOME/安裝位置
 
2.            jbpm-starters-kit-with-eclipse-3.0 解壓縮於任意資料夾中。
3.            啟動*/jbpm-starters-kit-with-eclipse-3.0/jbpm-designer/eclipse/eclipse.exe,開啟一個新
4.            Jave project(附錄 A)
5.            由於該工作只有 JRE 資源, 我們還需要將jbpm-starters-kit-with-eclipse-3.0/jbpm/lib 下所有的jar 檔引進工作中, 並將jbpm-starters-kit-with-eclipse-3.0/jbpm/buld jbpm-3.0.jar jbpm-identity-3.0.jar引進。(附錄 B)
6.            (Optional:亦可使用 HSQL。使用PostgresSQL 是為了模擬實際的應用)
最後我們架設一個資料庫。安裝好postgresql-8.0.3。於開始/所有程式/ PostgreSQL 8.0
開啟 start service。開啟 pgAdmin III (PostgresSQL 前端管理介面) 並於伺服器選擇連線,待連上後新建資料庫。
重回 Eclipse,將jbpm-starters-kit-with-eclipse-3.0/jbpm/src/config.files 引進,改變
hibernate.cfg.xml 中的jdbc connection properties,將原本的去除(或註解)改加上
     <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
              <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
      <property name="hibernate.connection.url">jdbc:postgresql://localhost/
                                             [Data Base 名稱]</property>
      <property name="hibernate.connection.username">[你的名稱]</property>
      <property name="hibernate.connection.password">[你的密碼]</property>
postgresql-8.0-312.jdbc3.jar 引進。如此即完成 jBPM 的架設。
 
描述語言:
jBPM 將工作寫成 XML檔,稱為Process Definition
範例:
<process-definition name="TicketAndMeal">
 
        <!-- SWIMLANES -->
 
        <swimlane name="Employee">
           <assignment class="pkg1.assignmentHandler_E" />
        </swimlane>
 
        <swimlane name="Cook">
           <assignment class="pkg1.assignmentHandler_C" />
        </swimlane>
 
        <!-- NODES -->
 
        <start-state>
            <transition name="customer" to="OrderTicketAndMeal" />
        </start-state>
 
        <task-node name="OrderTicketAndMeal">
           <task naem="TakeMeal" swimlane="Employee">
               <controller>
                  <variable name="ticket" access="read,write" />
                  <variable name="meal" access="read,write" />
               </controller>
            </task>
           <transition to="MealDecision" />
        </task-node>
 
        <decision name="MealDecision">
           <transition name="no meal" to="Delivery">
               <condition>meal == 0</condition>
           </transition>
            <transition name="meal" to="Kitchen">
               <condition>meal != 0</condition>
           </transition>
        </decision>
 
        <task-node name="Kitchen">
           <task name="PrepareMeal" swimlane="Cook">
               <controller>
                  <variable name="meal" access="read" />
               </controller>
            </task>
           <transition to="Delivery" />
        </task-node>
   
        <task-node name="Delivery">
           <task name="Deliver">
               <assignment class="pkg1.OrderAssignmentHandler" />
           </task>
            <transition to="End" />
        </task-node>
   
        <end-state name="End" />
       
</process-definition>
 
可以看到,此ㄧ敘述由<process-definition> 這一個標籤包住, 裡面有states nodesState 代表 process instance在當下的狀態, UML 所說的 state 類似。Node 則是所有牽涉外部( process instance ) 的邏輯判斷區塊, task-node
 
整個 process definition 的結構:
開始:<start-state>
中間工作:<task-node>
傳遞:<transition>
結束:<end-state>
 
使用 jBPM 進行 workflow (工作流程)的管理須要遵守 JPDL 語法。(附在 userguide Chapter 13. jBPM Process Definition Language (JPDL))
 
各個 node 之間有 transitions 作連結。Task 是ㄧ個工作, 可以藉由指派 swimlane 份派工作給擁有同一個角色的不同人。在 swimlane 標籤中說明當需要這個角色時經由一個指定的 class 來分派工作。這個描述在assignment 中處理。每當工作流程遇上一個task,就會進行assignment的作業。(一個簡單的範例在$jbpm_HOME/src/java.examples/org/jbpm/tutorial/taskmgmt)
 
Controller 是控制變數的,當宣告變數時不加任何參數代表 read/write 皆可,可宣告為read only 或是 write only
(一個簡單的範例在
$jbpm_HOME/src/java.jbpm.test/org/jbpm/jpdl/xml/TaskControllerXmlTest.java)
 
Decision 同字面上的, 是決策機制。裡面可以有多個transition 到不同的nodeTransition 中包含 condition,作為判斷。Condition 回傳一個Boolean 值,為 true 則走向該 transition 所指的下ㄧ個 node,否則往下ㄧ個 condition
(一個簡單的範例在$jbpm_HOME/src/java.jbpm.test/org/jbpm/jpdl/exe/DecisionHandlerTest.java
 or ./DecisionConditionsTest.java)
 
上述的流程範例直接解釋為:
         此流程定義為TicketAndMeal
ㄧ開始,客人來到櫃檯前想要交易,ㄧ名員工(Employee)被指派接待客人。
員工先詢問要客人要買什麼(ticket or meal),客人告知需求後員工提交資料。
判斷:
如果有點ticketmeal的話,進入Kitchen
否,就進入Delivery
    Kitchen 中的 Cook 確認餐數(meals),製作完成後轉向Delivery
    Delivery 階段,系統計算出費用。員工確認收到正確金額後轉向end
 
常用API
1.        註冊 Process Definition (流程定義)
 
JbpmSessionFactory jbpmSessionFactory =
             JbpmSessionFactory.buildJbpmSessionFactory();
InputStream is =
          new FileInputStream("testProcessDefinition.xml");
JbpmSession jbpmSession =
jbpmSessionFactory.openJbpmSession();
jbpmSession.beginTransaction();
jbpmSession
.getGraphSession()
   .saveProcessDefinition(
ProcessDefinition.parseXmlInputStream(is)
);
jbpmSession.commitTransaction();
jbpmSession.close();
 
2.        獲得已註冊的 Process Definition 列表
 
JbpmSessionFactory jbpmSessionFactory =
             JbpmSessionFactory.buildJbpmSessionFactory();
JbpmSession jbpmSession =
jbpmSessionFactory.openJbpmSession();
jbpmSession.beginTransaction();
List processDefinitions =
  jbpmSession
      .getGraphSession()
      .findAllProcessDefinitions();
 
/*
if you want to look at processDefinitions, here we present
showing it on console.
*/
for(int i = 0 ; i < processDefinitions.countItems() ; i++){
   System.out.println(processDefinitions.get(i));
}
 
3.        create process instance
 
當我們獲得所有的 Process Definition 之後,我們生成一個 Process Instance 以進行指定的 Process Definition workflow
 
ProcessDefinition processDefinition =
          jbpmSession
              .getGraphSession()
              .findLatestProcessDefinition(
processDefinitions.get(*)
);
ProcessInstance processInstance =
      new ProcessInstance(processDefinition);
 
參考:$jbpm_HOME/src/java.examples/org/jbpm/tutorial/db
 
/*
   ‘ * ’ means the Process Definition’s number
   In list processDefitions.
*/
 
4.        獲取 process instance list
 
生成Process instance 之後,我們可以藉由以下的function幫助我們找尋一 Process Definition 下有哪些 instance
 
List processInstances =
      jbpmSession
          .getGraphSession();
          .findProcessInstances(*);
/*
   ‘*’ is a long type which equals the process definition number
in list processDefinitions
*/
 
參考:$jbpm_HOME/src/java.examples/org/jbpm/tutorial/db (在參考中的範例是僅供單機測試, 不能用於實際情況)
 
5.        獲取 task list
 
Task 是針對一個人在 process definition 中所扮演的角色的工作。
 
JbpmSessionFactory jbpmSessionFactory =
             JbpmSessionFactory.buildJbpmSessionFactory();
JbpmSession jbpmSession =
jbpmSessionFactory.openJbpmSession();
jbpmSession.beginTransaction();
 
List taskInstances =
      jbpmSession
          .getTaskMgmtSession();
          .findTaskInstances(*);
/*
           ‘*’ represents the actorID(角色) of this task
*/
 
如此,我們獲得角色應有的所有 task
 
參考:$jbpm_HOME/src/java.examples/org/jbpm/tutorial/taskmgmt (在參考中的範例是屬於測試, 不能用在實際情況)
 
 
6.        完成 task 並輸入值
 
JbpmSessionFactory jbpmSessionFactory =
              JbpmSessionFactory.buildJbpmSessionFactory();
JbpmSession jbpmSession =
jbpmSessionFactory.openJbpmSession();
jbpmSession.beginTransaction();
 
TaskInstance taskInstance=
             taskInstances.get(*);
taskInstance.submitParameters(mapvariable);
taskInstance.end();
       
jbpmSession.commitTransaction();
jbpmSession.close();
 
/*
‘*’ represents the number of the taskInstance in the list. This approach is based on the previous example, since we would like to view the task lists before we handle it.
Another approach would be assigning ID from jbpmsession, however, that will be a different programming logic.
 
The method submitParameters(java.util.Map parameter) will transfer data to the process instance scope “ticket” & “meal” by the key name in parameter.
*/
 
7.        輔助開發工具
 
Squirrel SQL Client
   ㄧ個免費的資料庫前端程式。
   http://squirrel-sql.sourceforge.net/
設定好 driver 之後, 可以連上各家的資料庫。排版上和資料編排上較人性。
Java Based
 
PostgresSQL 的使用小秘方
   在開發中的 workflow 系統時常需要將 table ㄧ再重新輸入資料庫。
有一個方法可以在不銷毀資料庫下清除內部資料:
 開啟 PostgresSQL 後選擇ㄧ資料庫。
 選工具/查詢工具 (或是 menu 上的筆狀圖示)
 工具在:
    %jBPM starterkit eclipse_HOME%/jbpm-db/build/script
      clear:毀資料
      drop.create:毀掉 table 後重建
      drop:消滅
      creat:建立table
   如此, 我們不必在註冊時說明建立 table
   (這個功能只有在 jbpm-db 中有, table是根據 jBPM 的需要建立)
 
Eclipse 中的 process definition 圖形介面
因目前處於開發階段,該圖形介面能夠提供的功能不多。只能畫出基本架構,無法做出更精密的控制
安裝方式:
下載JBoss jBPM Process Designer Plugin , plugin 資料夾的所有檔案複移到 $Eclipse_HOME/plugin/ 下。
開啟的方式:
project 新增à other à JBOSS jBPM à Process Definition
           使用方法:
開啟後會出現一個 *.par folder,點開後左下方有 diagram sorce。從 diagram 中可以拉工具繪製,sorce 中可以用手寫的方式更動。
           使用心得:
此圖形介面立意雖好, 但是無法做出更進ㄧ步控制。例如:controller, 而且task 並沒有顯示在 task-node 標籤下。如果使用者直接貼上code, 圖形產生器可能無法建立 process definition graph。使用起來起來相當不方便
 
 
 
8.        網站手冊以及資源
 
jBPM 網站:http://www.jboss.com/products/jbpm
 
jBPM userguid off-line%JBPM_HOME%/doc/userguide/en

工作流引擎:jbpm和activiti

目前流行的工作流引擎有Activiti和jBPM5,而在jBPM5发布以前大多数项目、平台都是基于jBPM3、jBPM4开发的。jbpmJBPM,全称是Java Business Process Ma...
  • zhang_study_it
  • zhang_study_it
  • 2015年09月09日 23:45
  • 1339

Java工作流引擎学习----JBPM(一)

Java工作流引擎学习----JBPM  一、简介 主动性编程: 方法  --->  类 --->  jar ---> 类库    特性:已经封装好的功能,供我们去调用,通过组合这些功能来完成代码...
  • qq_26504875
  • qq_26504875
  • 2016年01月09日 10:53
  • 5848

工作流引擎选择(为何使用activiti而不是jbpm)

SuccezBI之前在选择工作流引擎时曾经在activiti和jbpm之间有过比较,当时做出的决定是使用jbpm,但实际开发过程中发现这个选择是不合适的。目前我们改为选择Activiti作为工作流模块...
  • u012410388
  • u012410388
  • 2014年03月06日 19:10
  • 6319

jbpm工作流引擎总结文档

  • 2013年08月28日 15:51
  • 3KB
  • 下载

JBPM工作流引擎内核设计思想及构架笔记分享

  • 2014年06月21日 12:55
  • 333KB
  • 下载

JBPM工作流引擎 中文帮助文档

  • 2008年10月30日 15:35
  • 338KB
  • 下载

基于java的jBPM4工作流引擎

  • 2010年10月13日 18:14
  • 1.07MB
  • 下载

工作流引擎开发包jbpm

  • 2012年09月06日 11:59
  • 22.03MB
  • 下载

J2EE工作流引擎-jbpm开发详解

  • 2010年03月16日 13:45
  • 440KB
  • 下载

JBPM工作流引擎之并发流程&组任务&事件&自定义任务

这是多个分支并行(同时)执行的,并且所有的分支Execution都到Join活动后才继续向后执行。 依次等待join()前的所有分支任务合并起来才能执行完成。 /** * 查询组任务...
  • worn_xiao
  • worn_xiao
  • 2017年02月14日 18:30
  • 205
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:jbpm 工作流引擎
举报原因:
原因补充:

(最多只允许输入30个字)