jBPM jPDL 用户开发手册 3.2.3 - 第10章
第10章流程建模
10.1. 概述
在令牌进入节点后,这个节点被执行。节点自己负责图执行连续(continuation of the graph execution)。图执行连续完成后使令牌离开这个节点。每个节点类型为图执行连续实现一个不同的行为。不传播执行的节点将成为状态节点。
10.2. 流程图
图 10-1 拍卖流程图
<process-definition>
<start-state>
<transition to="auction" />
</start-state>
<state name="auction"> <transition name="auction ends" to="salefork" /> <transition name="cancel" to="end" />
</state>
<fork name="salefork"> <transition name="shipping" to="send item" /> <transition name="billing" to="receive money" />
</fork>
<state name="send item"> <transition to="receive item" />
</state>
<state name="receive item"> <transition to="salejoin" />
</state>
<state name="receive money"> <transition to="send money" />
</state>
<state name="send money"> <transition to="salejoin" />
</state>
<join name="salejoin"> <transition to="end" />
</join>
<end-state name="end" />
</process-definition>
|
10.3. 节点
一个流程图由节点和转换组成。更多的关于图和它的执行模型的信息,参考第4章 面向图的程序设计。
10.3.1. Node职责
· 3、创建新的执行路径。一个节点决定创建新的令牌。每个新令牌代表一个新的执行路径并且每个新令牌可以通过节点的离开转换被启动。这种行为相当的例子就是一个分支(fork)节点。
· 4、结束执行路径。节点能够决定执行路径的终点。那意味着令牌被结束并且执行路径被完成。
· 5、通常,节点可以修改整个流程实例的运行时结构。运行时结构是包含令牌树的一个流程实例。节点能够被创建并结束令牌、在图的一个节点上设置令牌以及通过转换启动令牌。
10.3.2. task-node节点类型
10.3.3. state节点类型
10.3.4. decision节点类型
10.3.5. fork节点类型
10.3.6. join节点类型
10.3.7. node节点类型
10.4. 转换
10.5. 动作
public class RemoveEmployeeUpdate implements ActionHandler { public void execute(ExecutionContext ctx) throws Exception { // 从流程变量上取得被操作的员工 String firedEmployee = (String) ctx.getContextInstance().getVariable("fired employee");
// 得到同jbpm更新使用的一样的同一个数据库连接,我们为我们的数据库更新
// 重用jbpm的事务
Connection connection = ctx.getProcessInstance().getJbpmSession().getSession().getConnection();
Statement statement = connection.createStatement(); statement.execute("DELETE FROM EMPLOYEE WHERE ..."); statement.execute(); statement.close(); }
}
|
<process-definition name="yearly evaluation"> ... <state name="fire employee"> <transition to="collect badge"> <action class="com.nomercy.hr.RemoveEmployeeUpdate" /> </transition> </state> <state name="collect badge"> ...
</process-definition>
|
10.5.1. 动作配置
10.5.2. 动作引用
10.5.3. 事件
10.5.4. 事件传播
10.5.5. 脚本
- executionContext
- token
- node
- task
- taskInstance
<process-definition>
<event type="node-enter"> <script> System.out.println("this script is entering node "+node); </script> </event> ...
</process-definition>
|
<process-definition>
<event type="process-end"> <script> <expression> a = b + c; </expression> <variable name='XXX' access='write' mapped-name='a' /> <variable name='YYY' access='read' mapped-name='b' /> <variable name='ZZZ' access='read' mapped-name='c' /> </script> </event> ...
</process-definition>
|
10.5.6. 定制事件
注意也可能在流程执行期间触发你自自己的事件。事件通过图的组成元素(节点、转换流程定义和超级状态是图元素)以及事件类型(java.lang.String)唯一地定义。jBPM为节点、转换和其他的图元素定义一系列的触发事件。在动作中、自定义的节点实现中或甚至流程执行的外面,你可以调用GraphElement.fireEvent(String eventType, ExecutionContext executionContext);。事件类型的名称可以被自由的选择。
10.6. 超级状态
10.6.1. 超级状态转换
10.6.2. 超级状态事件
10.6.3. 分层命名
<process-definition>
... <state name="preparation"> <transition to="phase one/invite murphy"/> </state> <super-state name="phase one"> <state name="invite murphy"/> </super-state> ...
</process-definition>
|
<process-definition>
... <super-state name="phase one"> <state name="preparation"> <transition to="../phase two/invite murphy"/> </state> </super-state> <super-state name="phase two"> <state name="invite murphy"/> </super-state> ...
</process-definition>
|
10.7. 异常处理
注意在一个处理异常的动作里,它可能使用Token.setNode(Node node)方法来放置这个令牌在图的任意一个节点上。
10.8. 流程组成
<process-definition name="hire"> <start-state> <transition to="initial interview" /> </start-state> <process-state name="initial interview"> <sub-process name="interview" /> <variable name="a" access="read,write" mapped-name="aa" /> <variable name="b" access="read" mapped-name="bb" /> <transition to="..." /> </process-state> ...
</process-definition>
|
这个hire流程包含一个产生interview流程的流程状态。当执行到达“first interview”时,一个 interview流程的新的执行(=process instance)被创建。如果没有明确版本被指定,当部署hire流程时已知子流程的最新版本将被使用。为了让jBPM实例化一个特定版本,可选的版本属性可以被指定。为了延迟绑定指定的或最新的版本直到真正创建子流程时,可选的绑定属性应该被设置为late。然后hire流程的变量“a”被复制进入interview流程的变量“aa”中。同样的方法,hire流程的变量“b”被复制进入interview流程的变量“bb”中。当interview流程完成时,只有interview流程的变量“aa”被复制回hire流程的变量“a”中。
10.9. 定制节点行为
图 10-3 更新ERP例子的流程片段
public class AmountUpdate implements ActionHandler { public void execute(ExecutionContext ctx) throws Exception {
// 业务逻辑
Float erpAmount = ...从ERP系统中获取数量...;
Float processAmount = (Float) ctx.getContextInstance().getVariable("amount"); float result = erpAmount.floatValue() + processAmount.floatValue(); ...update erp-system with the result...;
// 图执行传播
if (result > 5000) {
ctx.leaveNode(ctx, "big amounts");
} else {
ctx.leaveNode(ctx, "small amounts");
}
}
}
|
它也可能创建并合并令牌在定制的节点实现里。就如何做这个的例子,到jbpm源代码检出Fork和Join节点实现吧 :-)。
10.10. 图执行
- Token.signal(Transition)
- --> Node.leave(ExecutionContext,Transition)
- --> Transition.take(ExecutionContext)
- --> Node.enter(ExecutionContext)
- --> Node.execute(ExecutionContext)
10.11. 事务划分
我们这里描述的jPDL属性是来自第15章 异步连续的建模视图。
...
<start-state>
<transition to="one" />
</start-state>
<node async="true" name="one"> <action class="com...MyAutomaticAction" /> <transition to="two" />
</node>
<node async="true" name="two"> <action class="com...MyAutomaticAction" /> <transition to="three" />
</node>
<node async="true" name="three"> <action class="com...MyAutomaticAction" /> <transition to="end" />
</node>
<end-state name="end" />
...
|
...start a transaction... JbpmContext jbpmContext = jbpmConfiguration.createContext(); try { ProcessInstance processInstance = jbpmContext.newProcessInstance("my async process"); processInstance.signal(); jbpmContext.save(processInstance); } finally { jbpmContext.close();
}
|
jBPM jPDL 用户开发手册 3.2.3 - 第10章相关推荐
- 佳铁怎样传输程序_阿里资深开发工程师合著《Java开发手册》,影响250万程序员附pdf...
写在前面 <码出高效: Java开发手册> 源于影响了全球250万名工程师的<阿里巴巴Java开发手册),作者静心沉淀,对Java规约内容的来龙去脉进行了全面而彻底的梳理.本书以实战 ...
- .NET Micro Framework开发板用户简明手册(v3.0)
说明:前段时间已经先后发布了<.Net Micro Framework开发板用户简明手册>和< .NET Micro Framework开发板用户简明手册(v2.0)>,分别对 ...
- Java基础知识第二讲:Java开发手册/JVM/集合框架/异常体系/Java反射/语法知识/Java IO
Java基础知识第二讲(Java编程规范/JVM/集合框架/异常体系/Java反射/语法知识/Java IO/码出高效) 分享在java学习及工作中,常使用的一些基础知识,本文从JVM出发,讲解了JV ...
- android 设置setmultichoiceitems设置初始化勾选_阿里巴巴Java开发手册建议创建HashMap时设置初始化容量,但是多少合适呢?...
集合是Java开发日常开发中经常会使用到的,而作为一种典型的K-V结构的数据结构,HashMap对于Java开发者一定不陌生. 关于HashMap,很多人都对他有一些基本的了解,比如他和hashtab ...
- 设置作者_阿里Java开发手册建议创建HashMap时设置初始化容量,但多少合适
集合是Java开发日常开发中经常会使用到的,而作为一种典型的K-V结构的数据结构,HashMap对于Java开发者一定不陌生. 关于HashMap,很多人都对他有一些基本的了解,比如他和hashtab ...
- 《AOSuite 开发手册》之AOSuite 服务端开发
2019独角兽企业重金招聘Python工程师标准>>> <AOSuite G1开发手册>http://git.oschina.net/osworks/AOS/wikis/ ...
- 阿里JAVA开发手册零度的思考理解(二)
转载请注明原创出处,谢谢! 说在前面 人生的大道上默默地走,就必须要有一盏灯亮着为你引导方向!而这盏灯抑或只是一句话,一句鼓励,一个赞美,一次承认,一次认可,一次相识一次交流-- 上篇文章:阿里JAV ...
- 读书笔记:《HTML5开发手册》--figure、time、details、mark
周日继续读<HTML5开发手册>,并进行Demo练习,今天主要学习四个HTML5新增的元素:figure.time.details.mark. 不学不知道,原来这些平时不注意的元素都有着很 ...
- BATZ,一份《Android架构开发手册》就够,已offer
前言 今年的面试比往年要难得多,各个互联网企业对于Android岗位的要求越来越多,也越来越高,主要是初级岗位已经趋近饱和,但高级岗位又相对来说缺乏,这类的人才偏少,因此作为Android开发人员,我 ...
最新文章
- 史上最全开源中文 NLP 数据集:包括10大类、142条数据源,总有你钟意的那一款!...
- 没有c语言基础可以学python吗-学习Python之前需要先学习一下c语言吗?
- 九、二手信息站点后台完成 (IVX 快速开发教程)
- android刷新时的圆形动画_Android自定义加载圈动画效果
- SQL那些事儿(八)--oracle用户、表、表空间之间的关系
- Excel文件内容比对 -- Java Apache Poi
- 超高度近视合并白内障患者如何重返年轻优视力
- PopupWindow 监听返回键
- String Shifting(今日头条2017秋招真题)
- 123456789 往这串数字里插入3个乘号,使得结果最大
- Excel-VBA:“银行家舍入” 与“国际标准的四舍五入”
- 主平台对接多个系统,系统表的性能和对接方案
- Android 关于系统应用添加一键拨号
- 【数据结构功法】第2话 · 一篇文章带你彻底吃透·算法复杂度
- ue4-runtime_ubuntu_docker_使用教程方法
- Group by 后面直接加数字
- [转]SaaS风暴:中国软件企业如何应对挑战?
- Linux文件系统预读的情景分析
- css-alert-demo
- Tikadpro分享 | 如何广告投放和管理优化