Chinaunix首页 | 论坛 | 博客
  • 博客访问: 69360
  • 博文数量: 64
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 610
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-02 09:27
文章分类
文章存档

2009年(2)

2008年(1)

2007年(28)

2006年(33)

我的朋友

分类: Java

2006-08-30 14:03:51

一.几个概念:

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())。

fsignal(信令)

一个signal 发送给token通知token 继续流程的执行。如果signal 没有指定transitiontoken将沿缺省的transition离开当前状态,如果signal 指定transitiontoken将沿指定的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 tokenprocessInstance.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是父子关系!
 

 

 

 

阅读(1207) | 评论(0) | 转发(0) |
0

上一篇:sqlserver安装出错

下一篇:eclipse 快捷键

给主人留下些什么吧!~~