PVM的过程调度是非常灵活的,PVM提供了一套和token类似的execution过程调度机制,通过对execution的完全操控,节点运行期行为有了无限的可能。
PVM的流程定义模型

首先要说明的是,上图里的类全是接口。位于最上层的是ObservableElement,其提供给流程元素以附加Event(事件)的能力。在ObservableElementImpl里,它持有一个events的集合属性。对于流程元素来说,典型的事件有:流程启动/结束,节点启动/结束和转移线执行(take)。
protected Map<String, EventImpl> events;
Event又做了些什么呢?EventImpl透过EventListenerReference实例的集合持有EventListener实例。这样在引擎执行过程调度时,就非常容易地通过流程元素本身获取事件监听器并在相应的时候执行它们。
protected List<EventListenerReference> listenerReferences;
和传统的观察者模式一致,EventListener接口有且只有一个方法:
void notify(EventListenerExecution execution) throws Exception;
紧接着ObservableElement的是CompositeElement,其扩展了ObservableElement接口。先看看它的方法:
List<? extends Activity> getActivities();
boolean hasActivity(String activityName);
Activity getActivity(String activityName);
很明显,它持有了Activity的集合,对于ProcessDefinition来说,这是一件很自然地事情:流程定义包含多个节点定义。重要的是Activity自身华丽的变身:节点定义实现了嵌套,出现了结构块。看图说话:

这一设计在jBPM3里是没有的,但是在jBPM4里则必须出现,因为结构块是BPEL和BPMN里的重要概念。既然号称PVM,则必须向BPEL和BPMN致敬。稍后我们可以看到,结构块的引入给引擎过程调度增加了很大的复杂度。在jPDL里,与之对应的实现是group。这是jBPM4流程定义模型的最重要改变。
ProcessDefinition和Activity分别继承自CompositeElement,Activity和Transition建立起双向关联,这三者也是工作流模型里的标准建模。
PVM的过程调度
jBPM4采用execution来记录当前流程执行的位置,并通过移动execution来推动流程的流转。
/** transient cached current activity pointer. persistence is managed in {@link #activityName} */
private ActivityImpl activity;
/** transition is not to be made persistable by default */
protected TransitionImpl transition;
execution通过activity和transition属性来记录位置。

execution是可以嵌套的,即会存在一种父子关系构成树状结构,在任何时间,只有叶子execution处于活动状态。最上层的execution称为根execution,jBPM4里,根execution即为流程实例(在jBPM3里,记录流程执行位置的token和流程实例processInstance是独立分开的)。
在两种情况下,execution会产生子execution。一种情况是流程定义里存在并发路径,此时execution会根据并发的路径个数产生相应的子execution,子execution执行完毕并汇聚后则会触发它们的父execution继续流转。另外一种情况是节点定义存在自己的变量定义和时间服务定义,则执行该节点时会为该节点产生一个独立的子execution,产生该execution的目的在于使得该节点拥有独立的作用域,这个子execution也被称为scope execution。节点执行完毕后,与之关联的scope execution将会被移除,同时,父execution被重新激活流转。
1、 execution的移动
execution的移动操作被封装在atomicOperation里。execution通过执行atomicOperation来推动其的转移。目前移动execution的atomicOperation有7种,如下图所示:

ExecutionActivity执行节点定义的运行期行为。节点的运行期行为委派给ActivityBehaviour实现,当需要对节点行为进行扩展时,需要实现ActivityBehaviour接口。jBPM4存在两个对节点行为进行扩展的接口,分别是ActivityBehaviour和ExternalActivityBehaviour,ActivityBehaviour的execute方法在节点被执行时调用;ExternalActivityBehaviour继承自ActivityBehaviour,多出一个signal方法,在节点处于等待状态被触发流转时调用。
ActivityBehaviour activityBehaviour = activity.getBehaviour();
activityBehaviour.execute(execution);
Signal执行节点定义的运行期signal方法。
ExternalActivityBehaviour externalActivityBehaviour = (ExternalActivityBehaviour) activity.getBehaviour();
externalActivityBehaviour.signal(execution,signalName, parameters);
一个典型的signal方法会调用execution的take方法,从而将execution移动至给定的转移线上。jPDL里StateActivity类的signal方法:
execution.take(transition);
看看execution的take方法,设置execution位置并执行TransitionEndActivity:
//设置当前execution的位置
setTransition((TransitionImpl) transition);
//触发事件,执行TRANSITION_END_ACTIVITY原子操作
fire(Event.END,getActivity(),AtomicOperation.
TRANSITION_END_ACTIVITY);
TransitionEndActivity销毁移出节点的scope execution,接着执行TransitionTake:
//如果activity存在scope execution的话,则销毁,返回父execution
if (activity.isLocalScope()) {
propagatingExecution = execution.destroyScope(activity);
}
//父execution执行TRANSITION_TAKE原子操作
propagatingExecution.performAtomicOperation(AtomicOperation.
TRANSITION_TAKE);
TransitionTake触发转移线的take事件,并执行TransitionStartActivity:
execution.fire(Event.TAKE,transition,AtomicOperation.
TRANSITION_START_ACTIVITY);
TransitionStartActivity设置execution位置为目标节点,创建scope execution并执行ExecutionActivity:
//设置当前execution的位置
execution.setActivity(activity);
ExecutionImpl propagatingExecution = execution;
//如果activity存在scope的话,则创建scope execution
if (activity.isLocalScope()) {
propagatingExecution = execution.createScope(activity);
}
propagatingExecution.setTransition(null);
//scope execution执行EXECUTE_ACTIVITY原子操作
propagatingExecution.performAtomicOperation(AtomicOperation.
EXECUTE_ACTIVITY);
上述5种原子操作构成了一个完整的execution节点间移动过程,分别是:执行节点、触发流转、结束源节点、执行转移线和开始目标节点。如果节点是自动节点(没有等待状态),则触发流转(signal)这一步操作不会执行。
存在结构块的情况下,TransitionEndActivity会依次触发父节点的结束事件,前提是下一个目标节点未被父节点所包含,如果包含,则属于结构块内的节点移动;TransitionStartActivity会依次触发父节点的开始事件,前提同样是上一个源节点未被该父节点所包含,不属于结构块内的节点移动。
MoveToParentActivity使用在节点执行或signal时没有指定传播方式,同时又找不到移出的转移线时,会去执行父节点的signal操作。MoveToChildActivity使用在节点含有子节点时,将execution转移至子节点执行。这两种原子操作共同构成了进入和结束结构块时execution的移动行为。

分享到:
相关推荐
【jbpm 4 PVm】是关于业务流程管理(Business Process Management, BPM)的一个主题,主要涉及jbpm框架的第四代版本。jbpm是一个开源的工作流管理系统,它提供了全面的BPM解决方案,包括流程建模、部署、执行、监控...
### JBPM4 PVM的流程定义模型与过程调度 #### PVM的流程定义模型 JBPM4中的流程定义模型基于一套灵活且强大的架构设计,它不仅借鉴了BPEL和BPMN等标准规范,还引入了一系列创新的概念,使得整个模型更加适应现代...
### jBPM4的PVM实现解析 #### 一、PVM概述 PVM(流程虚拟机)是jBPM4中的核心概念之一,它提供了一个抽象层来处理流程定义和执行逻辑。PVM的设计目的是为了使流程引擎更加灵活、可扩展,并能够支持多种流程语言。...
### jbpm 4.3 pvm的使用 #### 一、概述 JBPM(Jobflow-Based Process Management)是一个开源的工作流引擎,它基于Java技术,主要用于实现业务流程管理(BPM)。JBPM允许开发者轻松地定义流程,并将其与应用程序...
4. **org.jbpm.pvm.internal.cfg**: 这里包含了配置文件的解析和流程引擎的初始化。`JbpmConfiguration`和`SpringConfiguration`实现了`org.jbpm.api.Configuration`接口,使得可以从配置文件中加载并创建`...
### JBPM4_PVM源代码分析 #### 一、概览 JBPM4_PVM(Process Virtual Machine)是JBPM框架中的一个核心组件,用于处理流程执行的核心逻辑。本文档将详细解析JBPM4_PVM的源代码结构,重点介绍其中的关键类及其功能...
PVM,全称Process Virtual Machine,是jBPM(Java Business Process Management)框架中的核心组件,专门用于执行工作流的底层逻辑。它与业务逻辑保持松耦合,避免了对业务代码的直接干预,同时也避免了配置的侵入,...
`org.jbpm.pvm.internal.cfg`包中的`JbpmConfiguration`和`SpringConfiguration`实现了配置接口,用于从配置文件创建`ProcessEngine`,这是整个Jbpm的核心。 `org.jbpm.api.client`包包含客户端API,如`...
jbpm-3.1.4.jar,jbpm工作流引擎jbpm工作流引擎
JBPM4引入了Process Virtual Machine(PVM)机制,用以替代之前的Token机制,以更灵活高效的方式管理流程执行。 总结,JBPM4提供了一套完整的工作流管理系统,包括流程设计、执行、监控和优化等功能,通过JPdl语言...
这个项目将Spring、Hibernate 4 和 Jbpm 4.4 整合在一起,构建了一个强大的企业级应用平台。SpringMVC处理HTTP请求,控制业务逻辑;Hibernate负责数据持久化,处理与MySQL的交互;Jbpm则用于流程管理和执行。这样的...
### 工作流系统技术选型可行性分析:JBPM4与JBPM5 #### 一、引言 在数字化转型的背景下,工作流系统成为提高组织效率的关键技术之一。医院作为一个复杂的组织机构,其内部流程的优化对于提升服务质量至关重要。...
jbpm.jar 文件包含了多个模块,如 jbpm-api, jbpm-log, jbPM-test-base, jbpm-pvm, jbpm-jpdl 和 jbpm-enterprise,为开发者提供了便捷的一站式解决方案。 【孵化器】章节详细讨论了正在开发和测试的新功能,这些...
JBPM4作为工作流管理系统的一种实现,它提供了服务API和PVM(Process Virtual Machine)以及JPDL(JBoss Process Definition Language),使得开发者能够更方便地定义和管理流程。PVM是JBPM4内部的工作流引擎,而...
标题“应用jBPM4解决中国特色的流程需求”和描述“应用jBPM4解决中国特色的流程需求,中国特色流程解决思路。”,以及标签“jbpm4 会签流程 会签”共同指向了探讨如何使用jBPM4这一工作流管理系统,来应对中国在工作...
- `jbpm-pvm-4.4.jar`:包含流程虚拟机(PVM)的核心实现,是Jbpm执行流程的基础。 - `jbpm-jpdl-4.4.jar`:提供了JPDL(Jbpm Process Definition Language)的支持,用于描述和解析流程定义文件。 - `jbpm-bpmn-4.4...
jboss jbpm4最新开发包 采用了pvm框架
JBPM4工作流介绍 本篇文章将对JBPM4工作流进行详细的介绍,涵盖工作流的概念、工作流引擎、工作流管理系统等方面的知识点。 一、工作流的概念 工作流是指在一个工作群组中,为了达成某一个共同目的而需要多人协力...
4. **流程虚拟机(PVM)**:PVM是jBPM的核心组件之一,它是一组用于生成和执行不同流程语言定义的商业流程的简单Java类库。PVM的嵌入式特性使其成为一种高效、易于集成的工作流解决方案。 #### 四、为何选择jBPM 1. ...
241 11.2 流程定义转换工具 242 11.2.1 命令行执行 242 11.2.2 Java编码执行 243 11.3 jBPM3到jBPM4的语义变更及翻译 244 11.4 小结 246 第12章 流程虚拟机原理 247 12.1 PVM的架构 247 12.2 PVM的实现 250 12.3 小...