jbpm 工作流引擎

2024-04-27 19:38
文章标签 工作 引擎 jbpm

本文主要是介绍jbpm 工作流引擎,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

安裝需求:
         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.                For sh / bash export JAVA_HOME / 安裝位置
                                            ii.                For tch / tcsh setenv JAVA_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 nodes State 代表 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 到不同的 node Transition 中包含 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) ,客人告知需求後員工提交資料。
判斷:
如果有點 ticket meal 的話,進入 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 工作流引擎的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/941358

相关文章

工作常用指令与快捷键

Git提交代码 git fetch  git add .  git commit -m “desc”  git pull  git push Git查看当前分支 git symbolic-ref --short -q HEAD Git创建新的分支并切换 git checkout -b XXXXXXXXXXXXXX git push origin XXXXXXXXXXXXXX

速了解MySQL 数据库不同存储引擎

快速了解MySQL 数据库不同存储引擎 MySQL 提供了多种存储引擎,每种存储引擎都有其特定的特性和适用场景。了解这些存储引擎的特性,有助于在设计数据库时做出合理的选择。以下是 MySQL 中几种常用存储引擎的详细介绍。 1. InnoDB 特点: 事务支持:InnoDB 是一个支持 ACID(原子性、一致性、隔离性、持久性)事务的存储引擎。行级锁:使用行级锁来提高并发性,减少锁竞争

嵌入式方向的毕业生,找工作很迷茫

一个应届硕士生的问题: 虽然我明白想成为技术大牛需要日积月累的磨练,但我总感觉自己学习方法或者哪些方面有问题,时间一天天过去,自己也每天不停学习,但总感觉自己没有想象中那样进步,总感觉找不到一个很清晰的学习规划……眼看 9 月份就要参加秋招了,我想毕业了去大城市磨练几年,涨涨见识,拓开眼界多学点东西。但是感觉自己的实力还是很不够,内心慌得不行,总怕浪费了这人生唯一的校招机会,当然我也明白,毕业

husky 工具配置代码检查工作流:提交代码至仓库前做代码检查

提示:这篇博客以我前两篇博客作为先修知识,请大家先去看看我前两篇博客 博客指路:前端 ESlint 代码规范及修复代码规范错误-CSDN博客前端 Vue3 项目开发—— ESLint & prettier 配置代码风格-CSDN博客 husky 工具配置代码检查工作流的作用 在工作中,我们经常需要将写好的代码提交至代码仓库 但是由于程序员疏忽而将不规范的代码提交至仓库,显然是不合理的 所

未来工作趋势:零工小程序在共享经济中的作用

经济在不断发展的同时,科技也在飞速发展。零工经济作为一种新兴的工作模式,正在全球范围内迅速崛起。特别是在中国,随着数字经济的蓬勃发展和共享经济模式的深入推广,零工小程序在促进就业、提升资源利用效率方面显示出了巨大的潜力和价值。 一、零工经济的定义及现状 零工经济是指通过临时性、自由职业或项目制的工作形式,利用互联网平台快速匹配供需双方的新型经济模式。这种模式打破了传统全职工作的界限,为劳动

Smarty模板引擎工作机制(一)

深入浅出Smarty模板引擎工作机制,我们将对比使用smarty模板引擎和没使用smarty模板引擎的两种开发方式的区别,并动手开发一个自己的模板引擎,以便加深对smarty模板引擎工作机制的理解。 在没有使用Smarty模板引擎的情况下,我们都是将PHP程序和网页模板合在一起编辑的,好比下面的源代码: <?php$title="深处浅出之Smarty模板引擎工作机制";$content=

3.比 HTTP 更安全的 HTTPS(工作原理理解、非对称加密理解、证书理解)

所谓的协议 协议只是一种规则,你不按规则来就无法和目标方进行你的工作 协议说白了只是人定的规则,任何人都可以定协议 我们不需要太了解细节,这些制定和完善协议的人去做的,我们只需要知道协议的一个大概 HTTPS 协议 1、概述 HTTPS(Hypertext Transfer Protocol Secure)是一种安全的超文本传输协议,主要用于在客户端和服务器之间安全地传输数据

以太网交换机工作原理学习笔记

在网络中传输数据时需要遵循一些标准,以太网协议定义了数据帧在以太网上的传输标准,了解以太网协议是充分理解数据链路层通信的基础。以太网交换机是实现数据链路层通信的主要设备,了解以太网交换机的工作原理也是十分必要的。 1、以太网协议介绍 1.1以太网协议 以太网是当今现有局域网(Local Area Network, LAN)采用的最通用的通信协议标准,该标准定义了在局域网中采用的电缆类型和信号

MySQL技术内幕_innodb存储引擎

MySQL技术内幕_innodb存储引擎 INNODB innodb中如果表没有主键 表是否由 非空唯一键,有则该字段为主键没有,则自动创建一个6字节大小的指针 innodb存储引擎的所有数据都存储在表空间中,表空间由段,区,页(块)组成。 如果启用了 innodb_file_per_table, 则每张表内的数据可以单独放在一个表空间中即使启用了上面参数,共享表空间也会因为 系统事务信息

Matter.js:Web开发者的2D物理引擎

Matter.js:Web开发者的2D物理引擎 前言 在现代网页开发中,交互性和动态效果是提升用户体验的关键因素。 Matter.js,一个专为网页设计的2D物理引擎,为开发者提供了一种简单而强大的方式,来实现复杂的物理交互效果。 无论是模拟重力、碰撞还是复杂的物体运动,Matter.js 都能轻松应对。 本文将带你深入了解 Matter.js ,并提供实际的代码示例,让你一窥其强大功能