说说 jBPM 流程虚拟机的原理
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<ActivityImpl> activities;
...
这使得流程定义拥有了包含多个活动定义的能力。
ActivityImpl.java:
...
protected List<TransitionImpl> outgoingTransitions = new ArrayList<TransitionImpl>();
protected List<TransitionImpl> incomingTransitions = new ArrayList<TransitionImpl>();
...
从代码中可以看出,一个活动可以具有多个流入转移和多个流出转移。
TransitionImpl.java:
protected ActivityImpl source;
protected ActivityImpl destination;
从代码中可以看出,一个转移只有一个源活动以及一个目的活动。
PVM 只提供了上述的执行环境以及 API,这些 API 被具体的活动类型所实现。活动可以是等待状态,即活动的控制权被交给系统的外部,比如人工任务活动或异步执行。当流程实例陷入等待状态,就意味着流程实例的上下文会被持久化到数据库中。
一个流程实例可以生成多个 “子执行”,每个执行都可以认为是指向当前活动的指针:
ExecutionImpl.java
...
/** are concurrent executions that related to this execution. */
protected Collection<ExecutionImpl> executions = new ArrayList<ExecutionImpl>();/** 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 的配置文件与流程定义文件。 |
说说 jBPM 流程虚拟机的原理相关推荐
- Java 虚拟机(JVM)原理介绍
Java 虚拟机[JVM]原理介绍 1.概述 2.Java类的加载原理机制 2.1 .Java类的加载过程 2.2 .Class loader (类加载器) 2.2.1 类的生命周期 2.2.1.1 ...
- 基于camunda如何实现会签:camunda会签流程配置与原理解析
一.背景 市场上比较有名的开源流程引擎有osworkflow.jbpm.activiti.flowable.camunda.由于jbpm.activiti.flowable这几个流程引擎出现的比较早, ...
- Docker的RUN流程和Docker原理、Docker的常用命令、其他命令
Docker的RUN流程和Docker原理 Run流程 底层原理 Docker是怎么工作的 Docker为什么比VM快 Docker的常用命令 帮助命令 镜像命令 查看镜像 搜索镜像 下载镜像 指定版 ...
- Run的流程和Docker原理
Run的流程和Docker原理 底层原理 Docker是怎么工作的? Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上.通过Socket从客户端访问! Doc ...
- JBPM流程部署校验之java利用XSD校验XML
JBPM流程定义校验之java利用XSD校验XML 上篇我们学习了在.net中怎样利用XSD来验证xml,今天我们来看一下在java中怎样实现利用xsd来校验xml! /** * */ pack ...
- java底层原理书籍_不愧是阿里p8大佬!终于把Java 虚拟机底层原理讲清楚了,请签收...
概述 JVM 的内存模型和 JVM 的垃圾回收机制一直是 Java 业内从业者绕不开的话题(实际调优.面试)JVM是java中很重要的一块知识,也是面试常问的问题之一,直至今天,仍然还有许多面试者在被 ...
- 计算机指令要素,【计算机系统】CPU指令执行流程与指令流水线原理
[计算机系统]CPU指令执行流程与指令流水线原理 一.指令执行流程 冯诺依曼架构CPU指令执行的五个阶段: 阶段 涉及的功能部件 IF 指令寄存器IR.程序计数器PC ID 指令译码器ID EXE C ...
- 【Java核心技术大会 PPT分享】陈阳:深入理解 Java 虚拟机编译原理
导读:深入理解 Java 虚拟机编译原理 直播分享PPT Java核心技术大会2022 分享主题:深入理解 Java 虚拟机编译原理 分享嘉宾:陈阳,京东科技架构师,曾就职于美团.去哪网,负责自研消息 ...
- activiti学习(二十一)——流程虚拟机源码分析(三)——从进入到离开userTask
前言 承接上文<activiti学习(二十)--流程虚拟机源码分析(二)--从开始节点离开到下个节点前>,假设execution接下来进入的节点是userTask,本文分析一下进入user ...
最新文章
- java窗口坐标_如何在Java中获取窗口外部的鼠标单击坐标
- 【PAT笔记】数学问题——素数和质因数
- OutOfMemoryError: GC Overhead Limit Exceeded错误处理
- 20、java中的类加载机制
- 网页压缩ob_start('ob_gzhandler')
- InsecureRequestWarning: Unverified HTTPS request is being made.解决方法
- php bc gmp,php中ipv6转纯数字和反转
- zabbix:unable to create mutex for log file
- mysql 全文所有_MySQL中的全文搜索
- 魅族魅蓝note6救砖及高通救砖工具分享
- centos修改用户密码图形化
- xmapp环境搭建注意事项
- pc登录2个微信客户端
- 重庆万州公交车坠江原因公布:乘客与司机激烈争执互殴致车辆失控
- 推荐一款适合苹果电脑小白使用的BT下载器
- 隔离变压器不触电原因
- 孟子《生于忧患,死于安乐》日:“故天将降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,所以动心忍性,曾益其所不能。”...
- Python提取PPT中的图片
- (一)关于POE供电定义以及级别划分,如何测试网线是否满足相关标准?
- SCCB协议介绍与应用和OV7670摄像头的寄存器配置
热门文章
- 微服务.链路追踪.OpenTracing
- python残差分析图
- Vue keep-alive组件缓存 基础用法
- 关于智能码控门禁系统项目的二维码验证问题
- [转载] 晓说——第1期:揭秘游戏规则奥斯卡走下“神坛“
- 转载_Linux下Bluetooth编程
- GetLastErr返回值ErrCode的宏定义以及含义
- Java算法实现 BAT公司为什么要考算法 github
- 利用PS的磁性套索工具进行抠图
- 20220年春招,秋招必问的1000道Java面试题及答案整理