上下文同流程变量有关.流程变量是同流程实例相关的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); 已知不足: 类型自动转换目前不支持. 这表明不允许用不同类型的值来覆盖变量. 要想这样做,必须首先删除老变量.当然用同类型的值覆盖是允许的.
< p> 变量是流程实例的一部分. 保存流程实例到数据库,保持数据库同流程实例同步.作为保存或更新流程变量在数据库中的结果变量从数据库被建立 ,更新和删除 .更多信息,参看 第六章,永久化.
每个执行路线(参看: 令牌) 有它自己的一套流程变量. 变量请求总是在令牌上发生. 流程实例有令牌树 (参看 面向图的程序设计 ). 当请求一个变量没有指明令牌, 那么默认的令牌是根令牌. 变量查询递归到给定令牌的父母令牌. 这个行为同程序开发语言里的变量范围是相似的. 当在令牌上设置不存在变量,那么变量就在根令牌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被使用:
转换器用来在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不需要任何改变. |
|