第 7 章 上下文
阅读本章,了解 进程变量。进程变量是维护进程实例相关信息的键值对。
注意
为了可以将 上下文 存储在数据库中,需要有一些小的限制。
7.1. 访问进程变量 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
org.jbpm.context.exe.ContextInstance
作为进程变量的核心接口。以这种方式从进程实例获取 ContextInstance
:
ProcessInstance processInstance = ...; ContextInstance contextInstance = (ContextInstance) processInstance.getInstance(ContextInstance.class);
ProcessInstance processInstance = ...;
ContextInstance contextInstance =
(ContextInstance) processInstance.getInstance(ContextInstance.class);
以下是基本操作:
变量名称为
java.lang.String
。默认情况下,Business Process Manager 支持以下值类型:(还支持任何其他可通过 Hibernate 保留的类。)
java.lang.String | java.lang.Boolean |
java.lang.Character | java.lang.Float |
java.lang.Double | java.lang.Long |
java.lang.Byte | java.lang.Integer |
java.util.Date | byte[] |
java.io.Serializable |
注意
未输入的 null 值 也可以永久存储。
警告
如果进程变量中存储了任何其他类型,则不要保存进程实例,因为这会导致异常错误。
7.2. 变量的实时 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
变量不必在进程存档中声明。在运行时,只需将任何 Java 对象放在变量中。如果变量不存在,它将创建,其方式与普通
java.util.Map
相同。请注意,也可以删除变量。
ContextInstance.deleteVariable(String variableName); ContextInstance.deleteVariable(String variableName, Token token);
ContextInstance.deleteVariable(String variableName);
ContextInstance.deleteVariable(String variableName, Token token);
类型可以自动更改。这意味着,允许类型覆盖具有不同类型值的变量。务必要始终尝试限制类型更改的数量,因为这会产生比普通列更新更多的与数据库通信。
7.3. 变量 Persistence 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
变量是进程实例的一部分。将进程实例保存到数据库中,会将数据库与进程实例同步。(通过此操作创建、更新和删除变量。) 如需更多信息,请参阅 第 4 章 Persistence 。
7.4. 变量范围 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
执行的每个路径(也称为 令牌)都有自己的进程变量集合。变量始终在执行路径上请求。进程实例有这些路径的树。如果请求了变量但没有指定路径,则默认使用
root 令牌
。
变量查找递归发生。它运行在给定执行路径的父项上。(这与使用编程语言限制变量的方式类似。)
当在执行路径上设置不存在的变量时,会在
root 令牌
上创建变量。(默认情况下,每个变量都有一个进程范围。) 要使变量令牌"本地",请明确创建它,如下例所示:
ContextInstance.createVariable(String name, Object value, Token token);
ContextInstance.createVariable(String name, Object value, Token token);
7.4.1. 变量过载 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
变量过载 意味着执行的每个路径都可以拥有具有相同名称的变量的副本。这些副本都是相互独立处理的,可以是不同的类型。如果一个正在通过同一转换启动多个执行并发路径,则可能会注意变量过载。这是因为,将区分这些路径的唯一操作就是它们自己的一组变量。
7.4.2. 变量覆盖 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
变量覆盖 意味着在更全局 执行路径中执行嵌套路径 的变量。通常,"嵌套执行路径"与并发相关: fork 和 join 之间的执行路径是到达 fork 中的执行路径的子项(嵌套)。例如,您可以在进程实例范围内使用此变量覆盖执行发送
和计费
路径中的名为 contact
的变量。
7.4.3. 任务实例变量范围 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
要了解任务实例变量,请阅读 第 8.4 节 “ 任务实例变量 ”。
7.5. 临时变量 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
当进程实例保留在数据库中时,因此也是正常的变量。但是,有时可能需要在委派类中使用变量,而不将其存储在数据库中。这可以通过 临时变量 来实现。
注意
临时变量的生命周期与
ProcessInstance
Java 对象的生命周期相同。
注意
由于它们的性质,临时变量与执行路径无关。因此,进程实例对象将只有一个映射。
临时变量可通过上下文实例中自己的一组方法访问。它们不需要在
进程definition.xml
文件中声明。
Object ContextInstance.getTransientVariable(String name); void ContextInstance.setTransientVariable(String name, Object value);
Object ContextInstance.getTransientVariable(String name);
void ContextInstance.setTransientVariable(String name, Object value);
本章详细介绍了进程变量。现在,读者应确信自己或她了解这个主题。