`

转载蜂巢软件分析的 JBPM的执行流程

阅读更多

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
 

分享到:
评论

相关推荐

    jbpm4流程提交及执行完整代码

    在jbpm4中,可以通过监听器或日志系统来追踪流程实例的活动,以便分析流程执行情况和优化流程设计。它可能包含了各个步骤的开始时间、结束时间、执行者信息等,对于调试和性能优化非常有帮助。 `action.txt`文件...

    JBPM采购申请系统——08_JBPM流程节点.7z

    JBPM采购申请系统——08_JBPM流程节点.7z JBPM采购申请系统——08_JBPM流程节点.7z JBPM采购申请系统——08_JBPM流程节点.7z JBPM采购申请系统——08_JBPM流程节点.7z JBPM采购申请系统——08_JBPM流程节点.7z JBPM...

    jbpm工作流程的说明文档

    jbpm以其灵活性和可扩展性,为开发者提供了执行流程语言,使得业务流程能够被有效地管理和自动化。该框架遵循Apache License Version 2.0和JBoss End User License Agreement协议,自2004年加入JBoss组织以来,不断...

    jbpm工作流程

    - **jbpm执行引擎**:负责执行流程定义,管理流程实例、任务和变量。 - **持久化层**:使用Hibernate进行数据存储,确保流程实例在系统重启后仍能恢复。 - **任务服务**:处理任务分配、完成和查询。 - **监控...

    JBPM流程引擎资料

    JBPM是业务流程管理(BPM)领域的一个灵活且强大的开源工作流引擎,它主要用于建模、执行和监控业务流程。文档《JBPM流程引擎资料》详细介绍了如何利用JBPM开发流程应用,涵盖了从框架构造到节点处理的方方面面。 ...

    jbpm业务流程

    2. **工作流引擎**:jbpm引擎负责执行流程实例,处理流程中的活动,如任务分配、状态转移等。引擎的核心功能包括流程实例的启动、暂停、恢复和结束。 3. **任务服务**:jbpm提供了任务服务,用于处理人参与的任务。...

    揭秘jbpm流程引擎内核设计思想及构架.doc

    执行引擎是指流程引擎的执行机制,它负责执行流程实例。 jbpm流程引擎内核的设计思想是基于Activity Diagram模型的,它使用了基于状态机的执行机制来管理流程实例的执行。jbpm流程引擎内核还提供了许多其他的功能,...

    JBPM 流程 监控 的实现

    4. **集成第三方监控工具**:可以将JBPM与像Prometheus、ELK Stack(Elasticsearch、Logstash、Kibana)等监控工具集成,通过这些工具的强大分析能力来实现对JBPM流程的性能监控和故障排查。 5. **扩展jbpm-console...

    JBPM Web流程设计器

    【JBPM Web流程设计器】是一种基于Web的工具,它允许用户设计、管理和执行业务流程,类似于Eclipse中的jbpm插件。这个设计器采用JavaScript(js)和ExtJS库来构建,提供了一个直观的图形化界面,使得非技术人员也能...

    jbpm4.4流程图

    jbpm4.4是JBoss企业级业务流程管理(Business Process Management)套件的一个版本,它主要用于设计、执行和管理业务流程。在这个“jbpm4.4流程图”中,我们关注的是如何通过图形化的方式来理解和操作这些流程。 ...

    jbpm显示执行位置demo

    jbpm显示执行位置demo是基于jBPM4的一个实践示例,主要目的是为了展示如何在jBPM系统中可视化地追踪流程实例的当前执行状态。jBPM(Java Business Process Management)是一个开源的工作流和业务流程管理系统,它...

    JBPM5流程图设计规则

    文档适用于所有使用JBPM5进行流程设计的开发者和业务分析师。遵循这些规则,可以提高流程图的标准化程度,减少误解,增强团队间的协作效率。 2. **工作流模板与节点类型支持** JBPM5支持多种节点类型,包括但不...

    JBPM流程引擎设计 工作流资料

    2. **流程执行**:JBPM流程引擎负责解析BPMN模型并执行流程实例。它能处理异步任务、并发分支、事件驱动的逻辑以及与外部系统交互等复杂情况。流程实例的执行是基于状态机的,每个步骤代表一个状态,通过事件触发...

    ExtJs+jbpm智能流程WEB设计器

    6. **工作流引擎**:jbpm的工作流引擎负责执行流程定义,处理流程实例的生命周期,包括启动、执行、暂停、恢复和结束。它还支持动态更改正在运行的流程,适应业务需求的变化。 7. **集成能力**:jbpm可以轻松地与...

    extjs jbpm4流程设计器

    ExtJS是一个JavaScript库,专用于创建富客户端用户界面,而jBPM4则是一个工作流管理系统,用于管理和执行业务流程。本篇文章将深入探讨这两个技术如何结合以实现"extjs jbpm4流程设计器"的功能。 首先,ExtJS是一个...

    JBPM工作流程API和Jar.zip

    5. `HistoryService`:提供对流程执行历史的查询功能,帮助分析和审计流程执行情况。 JAR文件通常包含JBPM的库依赖,这些库包括核心引擎、流程定义解析、任务服务、历史服务以及可能的数据库连接池和其他辅助组件。...

    jbpm流程设计器

    jbpm流程设计器是一款强大的工具,专门用于设计和构建jbpm工作流。...在整个过程中,jbpm流程设计器扮演着桥梁的角色,连接了业务分析师和开发人员,降低了业务流程管理的复杂性,提升了企业运营的效率。

    JBPM流程监控的实现过程

    本文将深入探讨如何通过手工编码方式在JBPM中实现流程监控,包括如何监控已发布流程的状态、流程实例的动态以及任务实例的执行情况。 #### 一、理解流程监控的核心需求 流程监控的核心目标在于实时掌握系统内流程...

    揭秘jbpm流程引擎内核.pdf

    这个教程“揭秘jbpm流程引擎内核.pdf”很可能是对jbpm核心机制的详细解析,包括引擎的内部结构、执行流程、任务调度以及优化技巧等内容,对于学习和掌握jbpm具有极高的价值。通过阅读这份教程,你将能够深入理解jbpm...

    使用JBoss jBPM实现流程访问和执行的授权

    使用JBoss jBPM实现流程访问和执行的授权

Global site tag (gtag.js) - Google Analytics