posts - 0,comments - 10,trackbacks - 0
1.实例化流程定义类,可选的方式包括:
ProcessDefinition.parseXmlResource("websale.par/processdefinition.xml");
1.1 装载 指定名字的文件为一个InputStream
1.2 解析这个InputStream中的流程定义xml
1.3 包装 InputStream为 InputStreamReader
1.4 实例化 JPDLReader
1.5 请求 JPDLReader.readProcessDefinition
1.5.1 创建流程定义的实例 processDefinition = ProcessDefinition.createNewProcessDefinition();
1.5.1.1 实例化 ProcessDefinition
1.5.1.2 装载 module定义对象 到 流程定义对象中,module定义于"jbpm.default.modules.properties"文件
1.5.2 请求 SchemaValidationHelper校验 流程定义文件是否符合其Schema
1.5.3 解析流程定义xml文件的根元素下的各个元素
1.5.3.1 解析 swimlane
1.5.3.1.1 解析每个 swimlane 定义,针对每个 swimlane定义
1.5.3.1.1.1 生成一个 swimlane对象
1.5.3.1.1.2 生成 assignment元素的 class属性所指定的类的对象(称为 委托对象),并放置到 swimlane对象中。
1.5.3.1.1.3 如果没有assignment元素,并且 该 swimlane 也不是 starttask所引用的swimlane,则 addWarning。
1.5.3.1.1.4 将swimlane追加加到 taskMgmtDefinition 的属性中。
1.5.3.2 解析 actions
1.5.3.2.1 遍历根元素下的每个Action元素
1.5.3.2.2 如果 该action的名字符合 给定的类型,则创建Action:createAction
1.5.3.2.2.1 在ActionTypes中找到当前Action的name所对应的class,并实例化该class(即action对象)
1.5.3.2.2.1.1 设置action对象的name
1.5.3.2.2.1.2 在ProcessDefinition对象的actions属性中追加action
1.5.3.2.2.1.2.1 解析 各Action元素的特殊属性到 Action对象中
1.5.3.2.2.1.2.1.1 如果是普通Action元素
1.5.3.2.2.1.2.1.1.1 如果 action元素的 ref-name属性 不为空,则 在JpdlXmlReader 的 unresolvedActionReferences属性中追加 该action元素和action对象
1.5.3.2.2.1.2.1.1.2 如果 action元素的 class 属性 不为空,则
1.5.3.2.2.1.2.1.1.3 实例化 Delegation,将实例化后的对象作为action对象的属性。
1.5.3.2.2.1.2.1.1.4 调用Delegaton的 read方法,解析action元素的class、config-type等属性到delegation对象中,并解析 元素的content到delegation对象中
1.5.3.2.2.1.2.1.1.5 根据 action元素的accept-propagated-events 属性,决定action对象的isPropagationAllowed属性(该属性决定该actions是否只处理该action所关联的元素发出的事件,不处理子元素传来的事件)
1.5.3.2.2.1.2.1.2 如果是 CancelTimerAction 元素
1.5.3.2.2.1.2.1.2.1 将“the name of the timer to be cancelled” 放置到 CancelTimerAction对象的属性中
1.5.3.2.2.1.2.1.3 如果是 CreateTimerAction 元素
1.5.3.2.2.1.2.1.3.1 解析“the name of the timer”
1.5.3.2.2.1.2.1.3.2 解析该元素下单个的Action元素(可能是 Action或script)
1.5.3.2.2.1.2.1.3.3 解析“time period between the creation of the timer and the execution of the timer”
1.5.3.2.2.1.2.1.3.4 解析“duration between repeating timer executions until the node is left”
1.5.3.2.2.1.2.1.3.5 解析 “a transition-name to be taken when the timer executes”
1.5.3.2.2.1.2.1.4 如果是 Script 元素
1.5.3.2.2.1.2.1.4.1 如果将表达式直接放在了 script元素的 content中,则直接解析该content作为 script对象的expression属性
1.5.3.2.2.1.2.1.4.2 否则,解析变量定义;解析 expression子元素的内容,作为script对象的expression属性


1.5.3.3 解析 nodes
1.5.3.3.1 遍历所有root元素的子元素,对于那些元素名称表明其是 node 的(通过查询NodeTypes来判定,因为NodeTypes中记录了合法的node元素的名称),进行处理
1.5.3.3.2 实例化 node 元素所对应的类,将流程定义对象 设置到 具体node对象的属性中。
1.5.3.3.3 解析node元素的公共部分
1.5.3.3.3.1 在ProcessDefinition 的notes属性中,追加本元素对应的node具体实现对象,如果本元素是StartState,则在ProcessDefinition中的startState属性为该元素的实现node
1.5.3.3.3.2 解析node 的子元素
1.5.3.3.3.2.1 解析子元素timer
1.5.3.3.3.2.1.1 解析给定node元素下的所有 Timer子元素
1.5.3.3.3.2.1.2 针对每个timer 子元素
1.5.3.3.3.2.1.2.1 新建 “创建timer”的action,将其加入node 的enter事件中
1.5.3.3.3.2.1.2.2 新建“取消timer”的action,将其加入 node 的leave事件中
1.5.3.3.3.2.2 解析子元素 event
1.5.3.3.3.2.2.1 解析给定node元素下的所有 event 子元素
1.5.3.3.3.2.2.2 遍历所有event元素,创建对应的event ,增加到node中
1.5.3.3.3.2.2.3 遍历给定event元素下的所有action元素,创建对应的action,将action增加到 event中
1.5.3.3.3.2.3 解析子元素 execptionHandler
1.5.3.3.3.2.3.1 遍历给定node元素下的所有 exception-handler 子元素
1.5.3.3.3.2.3.2 解析每个 exception-handler,设置该处理器所处理的违例的名称,在node 中,增加该违例处理器,解析违例处理器下的每个action.
1.5.3.3.3.2.4 将该node 保存在 尚未解析转移 的node 的列表中.在JpdlXmlReader的未确定转移unresolvedTransitionDestinations属性中,追加本node元素和本node元素对应的node 实现
1.5.3.3.4 解析node元素的特殊部分
1.5.3.3.4.1 如果是 node,则 解析 node 中唯一的 action元素
1.5.3.3.4.2 如果是 decision,则 解析 其 handler的delegation,解析引出 transition和transition的条件
1.5.3.3.4.3 如果是 EndState/Join/State,则 没有特殊部分需要解析。
1.5.3.3.4.4 如果是 fork ,则 解析其 script子元素
1.5.3.3.4.5 如果是 process-state,则
1.5.3.3.4.5.1 解析 sub-process元素,获得子流程名称和版本,然后从数据库中提取该流程的定义。
1.5.3.3.4.5.2 解析 variable元素,获得变量名字、访问级别、变量在子流程中映射的名称
1.5.3.3.4.6 如果是 StartState,则 在TaskMgmtDefinition找到 该元素的swimlane,如果有task子元素,则解析该task,并在TaskMgmtDefinition中设置startTask属性,在task对象中设置startState属性
1.5.3.3.4.7 如果是 superState,则 解析 该 superState中的所有node,执行方式同 1.5.3.3
1.5.3.3.4.8 如果是 taskNode,则
1.5.3.3.4.8.1 解析signal属性(决定多个任务中,哪个任务能继续传递本node的Token) ;
1.5.3.3.4.8.2 解析 createTasks属性,决定是否自动创建task;
1.5.3.3.4.8.3 解析taskNode中的每个task元素
1.5.3.3.4.8.3.1 获得 taskNode的每个task子元素,针对每个task元素进行解析 readTask
1.5.3.3.4.8.3.1.1 实例化task类,设置processDefinition对象到其属性中,设置task元素的name 属性到其name属性
1.5.3.3.4.8.3.1.2 taskMgmtDefinition中的tasks属性中,追加本task对象
1.5.3.3.4.8.3.1.3 解析每个timer子元素(readTaskTimers)
1.5.3.3.4.8.3.1.3.1 实例化 CreatTimerAction,解析 timer属性到 该对象中
1.5.3.3.4.8.3.1.3.1.1 解析 timer的name
1.5.3.3.4.8.3.1.3.1.2 解析 timer的action 子元素
1.5.3.3.4.8.3.1.3.1.3 解析 timer中的 dudate 属性(timer从创建到其执行的持续时间)
1.5.3.3.4.8.3.1.3.1.4 解析 timer中的 repeat 属性
1.5.3.3.4.8.3.1.3.1.5 解析 timer中的 transition 属性(到期后执行的转移)
1.5.3.3.4.8.3.1.3.2 在 该task 创建EVENTTYPE_TASK_CREATE 事件,在该事件中创建 上面的 CreateTimerAction
1.5.3.3.4.8.3.1.3.3 在该Timer元素中找到 “cancel-event” 属性,该属性指定 哪些事件中取消timer,可以指定多个事件
1.5.3.3.4.8.3.1.3.3 在task中 创建 可以取消 timer的事件,并在这些事件中指定 cancelTimer的Action
1.5.3.3.4.8.3.1.4 解析每个event子元素(readEvents),增加 event 以及 event对应的Action到Task中。
1.5.3.3.4.8.3.1.5 解析违例处理器: readExceptionHandlers。在Task中增加违例处理器,为例处理器中的属性指定了该违例处理器究竟处理哪个违例(或者所有违例),并且指定了发生违例时进行处理的Action
1.5.3.3.4.8.3.1.6 设置 Task的 "description"、"dueDate"、"priority"
1.5.3.3.4.8.3.1.7 在TaskNode对象 中 追加本 Task对象
1.5.3.3.4.8.3.1.8 设置Task 的 "blocking"属性,该属性指出,是否等待本Task完成时,本node 上的Token才能离开
1.5.3.3.4.8.3.1.9 处理参与者分配
1.5.3.3.4.8.3.1.9.1 解析 task的 swimlane属性和assignment子元素
1.5.3.3.4.8.3.1.9.2 如果设置了 swimlane,在taskMgmtDefinition中找到 已经解析过的swimlane的定义,并将其设置到Task
1.5.3.3.4.8.3.1.9.3 如果没有设置 swimlane,但设置了 "assignment" 子元素
1.5.3.3.4.8.3.1.9.3.1 解析 "assignment" 的委托类
1.5.3.3.4.8.3.1.9.3.1.1 如果 "assignment"元素 有"expression"属性,则 为委托类对象设置流程定义对象,设置表达式分配处理类名称,设置表达式
1.5.3.3.4.8.3.1.9.3.1.2 如果 "assignment"元素 没有"expression"属性,则请 委托类 解析 assignment的定义,包括:解析 class名称、config-type、以及 assignment的content
1.5.3.3.4.8.3.1.9.3.2 将 "assignment" 的委托类的对象 设置到Task的属性中
1.5.3.3.4.8.3.1.10 解析 “task controller”(等同于 应用形参)
1.5.3.3.4.8.3.1.10.0 实例化 TaskController 类
1.5.3.3.4.8.3.1.10.1 如果包含 class属性,则解析 出一个委托类,将其添加到taskController对象中
1.5.3.3.4.8.3.1.10.2 否则,解析变量访问的设置
1.5.3.3.4.8.3.1.10.2.1 解析每个变量子元素,获得变量名称、访问限制、在 委托类里的映射名称
1.5.3.3.4.8.3.1.10.2.2 将所有变量的设置 添加到 taskController对象中
1.5.3.3.4.8.3.1.11 将TaskController 放到 Task 对象属性中

1.5.3.4 解析 events,寻找根元素下的所有Event子元素,在ProcessDefinition中增加event,为event增加其对应的所有Action
1.5.3.5 解析 违例处理器,寻找根元素下的所有违例处理器子元素,解析其处理的违例,其采取的action,将违例处理器 追加到 ProcessDefinition的属性中
1.5.3.6 解析Task,寻找根元素下的所有task子元素,对其解析,并追加到 ProcessDefintion的taskMgmtDefintion的属性中
1.5.3.6 解析每个node元素的 引出转移, resolveTransitionDestinations
1.5.3.6.1 找到每个node 元素,以及node 类对象,针对每个node 元素
1.5.3.6.1.1 寻找每个 transition,针对每个Transition
1.5.3.6.1.1.1 实例化Transition,将 processDefintion 作为 transition 对象的一个属性 ,设置transiton 的name
1.5.3.6.1.1.2 在 node 的引出转移 属性中 增加该 transition,将该transition 的from属性 设置为该node
1.5.3.6.1.1.3 寻找 该转移的目标node 的名称,并在 当前node 的容器中(可能是processDefinition或 superState) 找到目标node.
1.5.3.6.1.1.4 在目标node 的引入转移属性中,则将该transition,并将该transition的to 属性设置为该目标node
1.5.3.6.1.1.5 在该转移中,增加类型为“EVENTTYPE_TRANSITIOND”的事件,并增加事件的所有Action
1.5.3.6.1.1.6 在该转移中,增加 违例处理器
1.5.3.7 解析 Action 的 Reference.找到每一个 设置了"ref-name"属性的action,在processDefinition中,找到 ref-name 的值为名称的action.并将该引用的action设置到原action中
1.5.3.8 校验swimlane和assignment,如果某个 swimlane的assignment委托类为空,并且它不是StartTask的swimlane,则发出警告
1.5.3.9 如果 解析中产生了 级别为Error的 problem,则抛出违例


2.持久化流程定义
graphSession.saveProcessDefinition(processDefinition);
3.实例化流程实例 processInstance = new ProcessInstance(processDefinition);

3.1 记录传进来的流程定义
3.2 生成rootToken
3.2.1 记录token开始时间
3.2.2 记录流程实例
3.2.3 记录该流程的StartState为该Token的node.
3.2.4 记录该流程是否设置为隐式终止

3.3 记录流程开始时间
3.4 查找所有“可选模块”的定义,记录可选模块的实例。可选模块 定义在 jbpm.default.modules.properties 中。可选模块 构成了 JBPM的可插入式架构的机制。

3.5 使用配置好的 日志记录模块,记录流程创建事件。
3.6 如果当前上下文下 有用于持久化的session,则持久化 流程实例
3.7 生成 ExecutionContext
3.8 发布流程启动事件
3.8.1 在Log中记录流程启动事件 ,log.debug
3.8.2 在执行环境 executionContext 中 设置事件源
3.8.3 发布并传递事件
3.8.3.1 判断是否需要传递事件 如果事件源不是当前对象,则需要传递事件
3.8.3.2 执行事件对应的静态Action,找到流程定义中定义的类型为流程启动的事件,并执行定义中 该事件的Action.
3.8.3.2.1 找到流程定义时设定的 本流程元素中的给定类型的事件
3.8.3.2.2 执行event对应的actions
3.8.3.2.2.1 遍历所有Action
3.8.3.2.2.2 如果 本action接受其他 流程元素传递来的事件,或者 这不是一个传递来的事件 ,则执行本action
3.8.3.2.2.3 创建Action log
3.8.3.2.2.4 增加ActionLog日志项到 LoggingInstance 中,同时声明 该日志项,是一个组合日志的第一项
3.8.3.2.2.5 打印action执行 的log, log.debug
3.8.3.2.2.6 执行action
3.8.3.2.2.6.1 实例化 actionHandler
3.8.3.2.2.6.2 调用 actionHandler的execute方法
3.8.3.2.2.7 如果action执行抛出了违例
3.8.3.2.2.7.1 log.error
3.8.3.2.2.7.2 使用违例处理器来处理违例
3.8.3.2.2.7.2.1 在该流程元素中,找到应该处理 给定 违例 的违例处理器
3.8.3.2.2.7.2.1.1 遍历所有违例处理器,判断每个违例处理器是否应该处理一个违例
3.8.3.2.2.7.2.2 请求该违例处理器处理违例
3.8.3.2.2.7.2.2.1 执行该违例处理器的所有action
3.8.3.2.2.7.2.3 如果违例处理器 没有处理成功,则请求该流程元素的父元素处理该违例,如果没有父元素,则抛出一个缺省的委托类违例
3.8.3.2.2.8 执行Action后,必须要做下面的收尾工作
3.8.3.2.2.7.1 将executionContext中的Action属性置为空
3.8.3.2.2.7.2 标识 组合日志完成

3.8.3.3 执行事件对应的动态Action,动态Action,为运行时增加到ProcessInstance中的,与某个事件对应。
3.8.3.4 如果本 图元素的父元素存在,则调用父元素的 发布并传递事件 方法(参见上面的 3.8.3)。
3.8.4 在执行环境中 清空事件源





4.持久化 流程实例
5.通过hibernate 从持久层 装载4个对象实例
processDefinition = graphSession.loadProcessDefinition(processDefinition.getId());
processInstance = graphSession.loadProcessInstance(processInstance.getId());
contextInstance = processInstance.getContextInstance();
taskMgmtInstance = processInstance.getTaskMgmtInstance();

JBPM版本:3.0 beta1
作者:beehive.cn
版权所有:beehive.cn
查看更多JBPM源码追踪,请到 http://www.beehive.cn/modules/newbb/viewforum.php?forum=14
posted on 2007-07-11 14:07 大博的BLOG 阅读(1139) 评论(0)  编辑  收藏 所属分类: jbpm

只有注册用户登录后才能发表评论。


网站导航: