免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1491 | 回复: 0
打印 上一主题 下一主题

jbpm学习笔记 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-08-30 14:03 |只看该作者 |倒序浏览

一.几个概念:
process definition (流程定义):
一个process definition代表了一个正式的业务流程,它以一个流程图为基础。这个流程图由 许多node和transition组成。每个node在这个流程图里都有着各自特殊的类型,这些不同的类型决定了node在运行时的不同行为。一个process definition只有一个start state 。
node(节点) 表示流程中的一个节点。
c)  transition:关联两个节点,用于表示节点的走向
d) token(令牌)
令牌是执行的一个路线. 令牌是一个运行时概念,它始终指向流程图中的某个节点.
e) process instance(流程实例)
一个process instance(流程实例)即一个process definition(流程定义)的流程执行实例。一个process definition可以对应多个process instance。当一个process instance被创建的时候,一个主执行路径token同时被创建,这个token叫做root token,它指向流程定义的start state(processDefinition.getStartState()==token.getNode())。
f)signal(信令)
一个signal 发送给token通知token 继续流程的执行。如果signal 没有指定transition,token将沿缺省的transition离开当前状态,如果signal 指定transition,token将沿指定的transition离开当前的状态。看源代码可以看到发给process instance的signal 其实都是发送给了root token。

二.主要执行类的结构
2.1 GraphElement.java 是所有图形元素的超类。
有四个属性:
a)processDefine 表示当前元素属于哪个流程定义
b)events 表示可以接收哪些event
c)name 名字
d)exceptionHandlers 异常处理类集合(List)
2.2 node(节点);processDefinition(流程定义);Transition(转换);Task 它们都inherited from GraphElement
1)processDefinition表示流程定义,它有下面的属性:name(流程名字),version(流程版本),nodes(节点集),startState(起始节点) nodes表示流程中定义所有的node(节点),startState用于启动流程时找到首节点
2)Transition表示转换,它有三个属性:from(Node)-转自某个节点,to(Node)-转向某个节点,supportedEventTypes表示支持的事件(event)类型
3)node表示节点,它有四个属性:leaving transitions;arriving transitions;action;superState
4)Task 用于定义任务 ,主要定义在task-note中,task-note是节点(note)的一种。(task和task-note是两个不同的概念)
2.3各种不同的节点,它们都inherited from node decision;EndState;Fork;Join;Merge;Milestone; InterleaveEnd;InterleaveStart;ProcessState;State
三.流程执行
在整个流程实例运行过程中,我们可以迅速的利用token得到其当前的节点。在解决“并行”等(比如Fork)问题时,jBpm让Token对象维护了父子关系,这种关系在涉及到Fork的时候会产生。 jBpm让Token这个对象身兼了多种使命:(1)快速定位current state (2)用于fork,join算法 (3)用于告知任务执行者的任务索引。
如下代码:
ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
      "" +
      "  " +
      "    " +
      "  " +
      "  " +
      "    " +
      "      " +
      "    " +
      "  " +
      "  " +
      ""
    );
   
    // 创建流程实例
    ProcessInstance processInstance =
      new ProcessInstance(processDefinition);
   
    //取得根令牌
Token token=processInstance.getRootToken();
//信令触发流程执行
token.signal();
Token的signal方法也可以传入transition参数,这个方法把信令发送给Token,这样,令牌将被激活,并沿指定的transition离开当前的状态(如果没有指定transition,将沿缺省的transition 离开当前状态).
1)实例创建时,触发process-start相应的事件。同时由
Token记录了当前的节点(即根节点),只有当前的状态拥有该令牌。
2)向TOKEN发signal后,当前节点收到该signal,触发before-signal事件 ,执行相关的action,根据转换(transition)调用node.leave()函数触发node-leave事件,离开当前节点。
3)当前状态把令牌传给signal中指定的transition
4)transition收到令牌后,触发transition事件,调用转向节点(to)的enter事件,将令牌指向to节点.
5)根据令牌的位置,流程的状态已经发生了扭转.
6)上面的各种触发的事件events上附上我们自己写的action,就会带动action 的执行。action里是我们自己的相关java操作代码。另外,action也可以直接挂在node上,而不依赖于event(事件)的触发!
7)上面的执行实例中 node(节点)有两个主要的作用:
a)执行java代码,比如说创建task instance(任务实例)、发出通知、更新数据库等等。只要在node 上挂上我们的action
b) 控制流程的执行:
A、等待状态
流程进入到这个node时将处于等待状态,直到一个signal 的发出
B、流程将沿着一个leaving transition越过这个node
需要有个action挂在这个node上,action中将会调用到API里
executionContext.leaveNode(String transitionName),transitionName即这里的leaving transition名字。
C、创建新的执行路径
很典型的就是fork node。流程在这里会分叉,产生新的执行路径。这样就创建了新的token,每个新的token代表一个新的执行路径。注意的是,这些新的token和产生前的token是父子关系!






本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/20117/showart_162427.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP