jBPM4 PVM ( Process Virtual Machine ,流程虚拟机)的设计初衷是通过实现接口和定制插件等方式兼容多种流程定义语言和流程活动场景,为 “ 世界上 ” 所有的业务流程定义提供一套通用 API 平台 。 那么,无论是需要对 jBPM 原有流程定义语言进行扩展,或者重新实现一套专用的流程定义语言,都可以通过实现 PVM 指定的接口规范完成咯。
PVM 是一个特定可执行的图形化开发框架。基于 PVM 规范的流程定义可以实例化为 “执行流”,它拥有可以表现为图形的数据结构。
只要完全实现了 PVM 的接口规范,流程虚拟机通过这些接口执行我们设计的业务流程定义。
1 架构
PVM 将流程定义从具体的活动行为中剥离出来。它仅负责从流程的一个活动转移到下一个活动时,提取流程的执行上下文,而活动的具体行为则委派给可定制、可拔插的 Java 类。它还提供活动行为的 API,用来作为 PVM 和活动行为实现代码之间的桥梁。所以,jPDL 流程定义语言及其相关代码是一系列流程活动行为的实现和解析器。
流程定义可以看做是静态的业务过程模板,它包含活动(Activity)与转移(Transition),活动的行为被封装在该类型活动定义的实现中。
可以看出流程定义(ProcessDefinitionImpl) 与活动定义(ActivityImpl )都继承了抽象类 CompositeElementImpl。
在 CompositeElementImpl.java 中:
...
protected List activities;
...
这使得流程定义拥有了包含多个活动定义的能力。
ActivityImpl.java:
...
protected List outgoingTransitions = new ArrayList();
protected List incomingTransitions = new ArrayList();
...
从代码中可以看出,一个活动可以具有多个流入转移和多个流出转移。
TransitionImpl.java:
protected ActivityImpl source;
protected ActivityImpl destination;
从代码中可以看出,一个转移只有一个源活动以及一个目的活动。
PVM 只提供了上述的执行环境以及 API,这些 API 被具体的活动类型所实现。活动可以是等待状态,即活动的控制权被交给系统的外部,比如人工任务活动或异步执行。当流程实例陷入等待状态,就意味着流程实例的上下文会被持久化到数据库中。
一个流程实例可以生成多个 “子执行”,每个执行都可以认为是指向当前活动的指针:
ExecutionImpl.java
...
/** are concurrent executions that related to this execution. */
protected Collection executions = new ArrayList();
/** the parent child relation of executions is convenient for some forms of
* concurrency. */
protected ExecutionImpl parent;
protected ExecutionImpl processInstance;
...
/** transient cached current activity pointer. persistence is managed in {@link #activityName} */
private ActivityImpl activity;
...
可以看出,ExecutionImpl 可以具有多个子执行(ExecutionImpl ),即在需要的情况下,它可以分解为多个子执行并行运行,每个子执行都拥有其父执行的引用。每个执行都会指向当前的活动(ActivityImpl )。
2 实现
PVM 的实现按包划分如下:
包名 | 说明 |
---|---|
org.jbpm.pvm.internal.ant | 使用 ant 发布流程,辅助启动应用服务器。 |
org.jbpm.pvm.internal.builder | 用来构造各种工作流模型,包括活动、活动行为、事件、事件处理器、流程定义与变量等 。 |
org.jbpm.pvm.internal.cal | 实现工作日历。 |
org.jbpm.pvm.internal.cfg | JbpmConfiguration 和 SpringConfiguration 实现了 org.jbpm.api.Configuration,分别用来从默认配置文件或 Spring 配置文件中构造 ProcessEngine 对象。 |
org.jbpm.api.client | 供客户端程序调用的 API。 |
org.jbpm.pvm.internal.cmd | 包含 Command 和 CommandService 的接口及其实现,是 jBPM4 命令设计模式的基础 。 |
org.jbpm.pvm.internal.email | 提供电子邮件服务。 |
org.jbpm.pvm.internal.env | jBPM4 的系统环境,依赖于 IoC 框架,包括事务、依赖绑定、权限认证以及与上下文环境相关的类。 |
org.jbpm.pvm.internal.hibernate | 对 Hibernate 的封装,jBPM4 操作数据库的类都在这里。 |
org.jbpm.pvm.internal.history | 流程历史服务相关 API。 |
org.jbpm.pvm.internal.identity | 身份认证服务相关 API。 |
org.jbpm.pvm.internal.jms | JMS 消息服务实现。 |
org.jbpm.pvm.internal.job | 提供了对 job、message 和 timer 的实现。 |
org.jbpm.pvm.internal.jobexecutor | 提供了 job 执行器,包括 JobExecutorServlet、对应的线程池、命令和处理器 。 job、message 和 timer 最终都会被这里的类执行 。 |
org.jbpm.pvm.internal.lob | 处理与流程相关的富文本、字节码或二进制资源,如 jPDL 流程定义文件、图片、java 类以及序列化后的 Java 对象。 |
org.jbpm.pvm.internal.model | 包含了 jPDL 流程定义语言 XML 节点模型的所有 Java 实现,比如 Activity、CompositeElement、Condition、ObservableElement、OpenProcessDefinitionTransition 等接口以及它们的实现类。 |
org.jbpm.pvm.internal.query | 包含 History、Job、ProcessDefinition 及 ProcesInstance 的查询实现类,还包含 Page 类,用于实现查询结果的分页功能。 |
org.jbpm.pvm.internal.repositor | 发布和获取流程定义,并提供缓存功能。 |
org.jbpm.pvm.internal.script | 提供多种脚本解析引擎,包括 BeanShell、Groovy、Xpath 和 jUEL。 |
org.jbpm.pvm.internal.session | 支持各种会话,比如 DbSession、MessageSession, 、RepositorySession 和 TimerSession。 |
org.jbpm.pvm.internal.spring | 这里只有一个 CommandTransactionCallback ,它可以从 spring 中获取事务,并在事务中执行 jBPM4 的各种命令 。 |
org.jbpm.pvm.internal.stream | 从各种途径中获取资源,包括 jBPM4 配置文件和流程资源(流程定义引用的图片、类和表单等)都要通过包中的工具转换成流的形式,提供给工作流引擎进行处理 。 |
org.jbpm.pvm.internal.svc | svc 是 service 的缩写,它提供了 CommandService 接口和 org.jbpm.api 包下的所有服务接口的实现,以及一些命令拦截器。 |
org.jbpm.pvm.internal.task | 与任务相关的内容。 |
org.jbpm.pvm.internal.test | 只有一个 JobTestHelper ,它可以帮助在测试环境下运行 job 。 |
org.jbpm.pvm.internal.tx | 提供事务处理机制,包括 JTA 事务、Spring 事务以及标准事务。 |
org.jbpm.pvm.internal.type | 提供变量类型定义及各种数据类型的转换工具。子包包含类型转换器(converter)、类型匹配器(matcher)和变量类型定义(variable)。 |
org.jbpm.pvm.internal.util | 常用工具及一些常用接口。比如类加载工具、反射工具、字符串工具、XML 工具、课关闭接口(Closable)、监听接口(Listener)及观察接口(Observable)。 |
org.jbpm.pvm.internal.wire | jBPM4 的 IoC 框架,用于依赖注入与控制反转的实现。 |
org.jbpm.pvm.internal.xml | XML 解析模块,用于解析 jBPM4 的配置文件与流程定义文件。 |