完整的jBPM4 PVM介绍发表在《程序员》第8期,这里截取部分的意思是PVM的过程调度是非常灵活的,PVM提供了一套和token类似的execution过程调度机制,通过对execution的完全操控,节点运行期行为有了无限的可能。
PVM的流程定义模型
首先要说明的是,上图里的类全是接口。位于最上层的是ObservableElement,其提供给流程元素以附加Event(事件)的能力。在ObservableElementImpl里,它持有一个events的集合属性。对于流程元素来说,典型的事件有:流程启动/结束,节点启动/结束和转移线执行(take)。
- protected Map<String, EventImpl> events;
protected Map<String, EventImpl> events;
Event又做了些什么呢?EventImpl透过EventListenerReference实例的集合持有EventListener实例。这样在引擎执行过程调度时,就非常容易地通过流程元素本身获取事件监听器并在相应的时候执行它们。
- protected List<EventListenerReference> listenerReferences;
protected List<EventListenerReference> listenerReferences;
和传统的观察者模式一致,EventListener接口有且只有一个方法:
- void notify(EventListenerExecution execution) throws Exception;
void notify(EventListenerExecution execution) throws Exception;
紧接着ObservableElement的是CompositeElement,其扩展了ObservableElement接口。先看看它的方法:
- List<? extends Activity> getActivities();
- boolean hasActivity(String activityName);
- Activity getActivity(String activityName);
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;
/** 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);
ActivityBehaviour activityBehaviour = activity.getBehaviour(); activityBehaviour.execute(execution);
Signal执行节点定义的运行期signal方法。
- ExternalActivityBehaviour externalActivityBehaviour = (ExternalActivityBehaviour) activity.getBehaviour();
- externalActivityBehaviour.signal(execution,signalName, parameters);
ExternalActivityBehaviour externalActivityBehaviour = (ExternalActivityBehaviour) activity.getBehaviour(); externalActivityBehaviour.signal(execution,signalName, parameters);
一个典型的signal方法会调用execution的take方法,从而将execution移动至给定的转移线上。jPDL里StateActivity类的signal方法:
- execution.take(transition);
execution.take(transition);
看看execution的take方法,设置execution位置并执行TransitionEndActivity:
- //设置当前execution的位置
- setTransition((TransitionImpl) transition);
- //触发事件,执行TRANSITION_END_ACTIVITY原子操作
- fire(Event.END,getActivity(),AtomicOperation.
- TRANSITION_END_ACTIVITY);
//设置当前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);
//如果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);
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);
//设置当前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的移动行为。
相关推荐
### JBPM4 PVM的流程定义模型与过程调度 #### PVM的流程定义模型 JBPM4中的流程定义模型基于一套灵活且强大的架构设计,它不仅借鉴了BPEL和BPMN等标准规范,还引入了一系列创新的概念,使得整个模型更加适应现代...
PVM(流程虚拟机)是jBPM4中的核心概念之一,它提供了一个抽象层来处理流程定义和执行逻辑。PVM的设计目的是为了使流程引擎更加灵活、可扩展,并能够支持多种流程语言。作为一个嵌入式的流程引擎,PVM可以被集成到任何...
同时,jbpm 4支持基于图形化建模工具(如Eclipse BPMN2插件)进行流程模型的设计,使得流程定义更直观,便于理解和维护。 提供的jbpm-pvm-1.0.beta1可能是一个早期版本的jbpm PVm模块,包含了相关的库文件、API文档...
在JBPM 4.3版本中,PVM (Process Virtual Machine) 是其核心组件之一,负责执行流程定义并管理流程实例的状态变迁。 #### 二、获取DbSession和TaskImpl 在JBPM中,`DbSession` 和 `TaskImpl` 都是非常重要的概念。...
2. **org.jbpm.pvm.internal.builder**: 包含用于构建模型的类,如活动、行为、事件、事件处理器、流程定义、变量和任务等。这些类是流程定义的基础,它们构建了流程实例的结构和逻辑。 3. **org.jbpm.pvm.internal...
1. **流程定义模型**:由ProcessDefinition、Activity、Transition等元素组成,描述了流程的结构和行为。 - ProcessDefinition:流程定义,包含一系列活动和转换。 - Activity:流程中的活动节点,如任务、决策等...
JBPM4_PVM(Process Virtual Machine)是JBPM框架中的一个核心组件,用于处理流程执行的核心逻辑。本文档将详细解析JBPM4_PVM的源代码结构,重点介绍其中的关键类及其功能。 #### 二、org.jbpm.pvm.internal.ant包 ...
jbpm4表结构模型jbpm4表结构模型jbpm4表结构模型jbpm4表结构模型
jbpm4 jbpl流程定义语言,详细介绍了jbpl语言的各种定义
JBPM4引入了Process Virtual Machine(PVM)机制,用以替代之前的Token机制,以更灵活高效的方式管理流程执行。 总结,JBPM4提供了一套完整的工作流管理系统,包括流程设计、执行、监控和优化等功能,通过JPdl语言...
jbpm4是一款强大的工作流管理系统,它提供了流程定义、流程实例管理、任务处理以及流程监控等一系列功能。在“jbpm4流程提交及执行完整代码”这个压缩包中,包含了实现jbpm4流程提交和执行所需的若干关键文件。下面...
4. **工作流引擎(Workflow Engine)**:jbpm4提供了一个强大的工作流引擎,它负责解析流程定义,执行流程实例,并根据业务规则进行任务的调度和分配。 5. **数据库存储(Persistence)**:jbpm4将流程实例、任务和...
jbpm4jbpm5是关于jbpm流程管理框架的专题,涵盖了jbpm4和jbpm5两个主要版本。jbpm是一个开源的工作流管理系统,用于帮助开发者实现业务流程自动化。以下是基于给定文件的信息,深入解析jbpm4和jbpm5的知识点: 1. *...
`org.jbpm.pvm.internal.builder`包包含模型构建相关的类,如活动、行为、事件等,这些是构建流程模型的基础元素。 `org.jbpm.pvm.internal.cal`包提供日历功能,包括日期、时间段和假期管理,这对于处理时间依赖的...
**JBPM4_DEPLOYMENT** — 流程定义表 - **作用**: 存储已部署流程定义的相关信息。 - **主要内容**: 包括流程定义的ID、名称、版本等元数据。 ##### 2. **JBPM4_DEPLOYPROP** — 流程定义属性表 - **作用**: 保存...
4. **工作流引擎**:JBoss JBPM4的核心组件,负责执行流程定义、任务调度和状态管理。当一个任务完成后,工作流引擎会根据流程定义中的流转规则决定下一个任务。 5. **监听器和事件**:在请假流程中,可能会有监听...
- **集成与扩展:** 讲述如何将jBPM4集成到企业应用中,以及如何进行流程引擎的定制和扩展。 - **案例分析:** 提供一些真实应用场景的案例分析,帮助开发者理解和掌握jBPM4在实践中的应用。 - **调试与优化:** ...
开发者可以通过查看和运行这些源代码,学习如何创建用户交互界面、与jbpm4服务交互以及如何实现流程的生命周期管理。 jbpm4还支持扩展和定制,例如,你可以通过编写自定义的工作流监听器、任务监听器和事件处理器来...
4. **部署流程**:将建好的流程模型部署到jBPM4的工作流引擎中,使之成为可执行的流程定义。 5. **编码实现**:编写控制层(Struts2 Action)、服务层(Spring Service)和持久层(Hibernate DAO)代码,实现流程...