上下文同流程变量有关.流程变量是同流程实例相关的key-value对 维护信息. 因为上下文必须保存在数据库中,将会稍微约束使用.
org.jbpm.context.exe.ContextInstance 作为提供流程变量服务的中央接口. 你可以从ProcessInstance 获得ContextInstance:
ProcessInstance processInstance = ...; ContextInstance contextInstance = (ContextInstance) processInstance.getInstance(ContextInstance.class);
最基本操作是
void ContextInstance.setVariable(String variableName, Object value); void ContextInstance.setVariable(String variableName, Object value, Token token); Object ContextInstance.getVariable(String variableName); Object ContextInstance.getVariable(String variableName, Token token);
变量名字是java.lang.String. By default, jBPM 支持下列变量类型:
要配置jBPM 保存hibernate 永久化对象到变量里,参看保存hibernate永久化对象.
变量必须在流程档案里声明.在运行时间,你可以把任何java object放到变量里. 如果一个变量不存在,将会被建立.同传统的 java.util.Map一样.
变量可被删除
ContextInstance.deleteVariable(String variableName); ContextInstance.deleteVariable(String variableName, Token token);
已知不足: 类型自动转换目前不支持. 这表明不允许用不同类型的值来覆盖变量. 要想这样做,必须首先删除老变量.当然用同类型的值覆盖是允许的.
每个执行路线(参看: 令牌) 有它自己的一套流程变量. 变量请求总是在令牌上发生. 流程实例有令牌树 (参看 面向图的程序设计 ). 当请求一个变量没有指明令牌, 那么默认的令牌是根令牌.
变量查询递归到给定令牌的父母令牌. 这个行为同程序开发语言里的变量范围是相似的.
当在令牌上设置不存在变量,那么变量就在根令牌root-token上被建立 .这就是说每个变量默认就是整个流程范围. 如果想建立一个令牌的局部变量,必须显式的使用API:
ContextInstance.createVariable(String variableName, Token token);
变量重载意味着意味着每个执行路线都有自己的同名字的变量复制. 它们被当作无关的和不同类型的. 当你在一个转换里调用多个并发的执行路线的时候,变量重载将变得有趣 这时候区分这些执行路线只能通过它们的一组变量.
当流程实例永久化到数据库中,正常变量也作为流程实例的一部分被永久化了.某些状态下你可能想在委托类里用变量 , 但是你不想把它储存在数据库中. 比如一个数据库connection 从jBPM传送到外面的一个委托类.这就可以由临时变量来做.
临时变量的生命周期同ProcessInstance java object一样.
由于这个自然特性,临时变量同令牌无关. 因此只有一个流程实例object的临时变量的map.
临时变量在上下文实例中可以从它们自己的变量组访问, 不需要在processdefinition.xml中声明
Object ContextInstance.getTransientVariable(String name); void ContextInstance.setTransientVariable(String name, Object value);
变量保存在数据库中有两个步骤:
user-java-object <---> converter <---> variable instance
变量保存在 VariableInstance s. VariableInstance s 的成员被被hibernate映射到数据库的字段. 在jBPM默认的配置中, 6 类型的VariableInstances被使用:
DateInstance (是一个java.lang.Date field 被映射到 Types.TIMESTAMP in the database)
DoubleInstance (是一个java.lang.Double 被映射到 a Types.DOUBLE in the database)
StringInstance (是一个java.lang.String 被映射到 Types.VARCHAR in the database)
LongInstance (是一个java.lang.Long field 被映射到 Types.BIGINT in the database)
HibernateLongInstance (hibernatable types作为long id field.一个java.lang.Object 被映射作为一个引用到 hibernate 数据库中的实体)
HibernateStringInstance (hibernatable types 作为 string id field. 一个java.lang.Object 被映射作为一个引用到 hibernate 数据库中的实体)
转换器用来在java-user-objects 和保存在VariableInstance s的java objects 来转换. 因此当一个流程变量被设置为 ContextInstance.setVariable(String variableName, Object value) , 变量可选则被改变然后改变的对象被保存在 VariableInstance . 转变器是实现了以下接口:
public interface Converter extends Serializable {
boolean supports(Class clazz);
Object convert(Object o);
Object revert(Object o);
}转变器是可选的. 转变器必须被 jBPM 类载入器可用
user-java-objects 被转换并保存在变量实例的方法在 org/jbpm/context/exe/jbpm.varmapping.properties文件中配置 . 定制这个属性文件, 把修改后的版本放到classpath的根, 说明在 章节 5.2, “配置文件” 属性文件每行都指明2或3个类名有空格搁开: the user-java-object的类名,可选的转变器的类名和变量实例的名字.当你引用你定制的转变器, 确定他们在 jBPM class path . 当你引用你定制的变量实例, 他们必须在 jBPM class path 并且hibernate 映射文件 org/jbpm/context/exe/VariableInstance.hbm.xml 必须更新以包含定制的 VariableInstance的子类.
比如, 看文件 org/jbpm/context/exe/jbpm.varmapping.properties.
java.lang.Boolean org.jbpm.context.exe.converter.BooleanToStringConverter org.jbpm.context.exe.variableinstance.StringInstance
这行指明了所有类型为Boolean的类型被转换器 BooleanToStringConverter转换并且 结果对象(a String)将被保存在StringInstance中.
如果没有转变器
java.lang.Long org.jbpm.context.exe.variableinstance.LongInstance
表明Long objects被存储在变量实例LongInstance不需要任何改变.