注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

我的博客

 
 
 

日志

 
 
关于我

风流茶说合,酒是色媒人,古往今来,浪涛依旧,我辈今朝,叱咤风云,

网易考拉推荐

第 7 章 Variables变量  

2010-06-06 17:29:47|  分类: jbpm |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

流程变量在流程外部,通过ExecutionService提供的方法进行访问:

  • ProcessInstance startProcessInstanceById(String processDefinitionId, Map<String, Object> variables);
  • ProcessInstance startProcessInstanceById(String processDefinitionId, Map<String, Object> variables, String processInstanceKey);
  • ProcessInstance startProcessInstanceByKey(String processDefinitionKey, Map<String, ?> variables);
  • ProcessInstance startProcessInstanceByKey(String processDefinitionKey, Map<String, ?> variables, String processInstanceKey);
  • void setVariable(String executionId, String name, Object value);
  • void setVariables(String executionId, Map<String, ?> variables);
  • Object getVariable(String executionId, String variableName);
  • Set<String> getVariableNames(String executionId);
  • Map<String, Object> getVariables(String executionId, Set<String> variableNames);

在流程中可以通过Execution接口,传递给用户代码,比如 ActivityExecutionEventListenerExecution

  • Object getVariable(String key);
  • void setVariables(Map<String, ?> variables);
  • boolean hasVariable(String key);
  • boolean removeVariable(String key);
  • void removeVariables();
  • boolean hasVariables();
  • Set<String> getVariableKeys();
  • Map<String, Object> getVariables();
  • void createVariable(String key, Object value);
  • void createVariable(String key, Object value, String typeName);

jBPM没有自动检测变量值变化的机制。 比如,从实例变量中获得了一个序列化的集合,添加了一个元素, 然后你就需要把变化了的变量值准确的保存到DB中。

7.1. 变量作用域

默认情况下,变量创建在顶级的流程实例作用域中。 这意味着它们对整个流程实例中的所有执行都是可见的,可访问的。 流程变量是动态创建的。意味着,当一个变量通过任何一个方法设置到流程中, 整个变量就会被创建了。

每个执行都有一个变量作用域。声明在内嵌执行级别中的变量, 可以看到它自己的变量和声明在上级执行中的变量,这时按照正常的作用域规则。 使用execution接口中的createVariable方法, ActivityExecutionEventListenerExecution可以创建流程的局部变量。

在未来的发布中,我们可能添加在jPDL流程语言中声明的变量。

7.2. 变量类型

jBPM支持下面的Java类型,作为流程变量:

  • java.lang.String
  • java.lang.Long
  • java.lang.Double
  • java.util.Date
  • java.lang.Boolean
  • java.lang.Character
  • java.lang.Byte
  • java.lang.Short
  • java.lang.Integer
  • java.lang.Float
  • byte[] (byte array)
  • char[] (char array)
  • hibernate entity with a long id
  • hibernate entity with a string id
  • serializable

为了持久化这些变量,变量的类型会按照这个列表中的例子进行检测。 第一个匹配的类型, 会决定变量如何保存。

7.3. 更新持久化流程变量

(jBPM 4.3中新添加的功能)

customs, event-handlers 和其他 用户代码中,你可以获取流程变量。当一个流程变量作为 持久化的对象被保存时,你可以直接更新反序列化的对象, 而不需要再次进行保存。jBPM会管理反序列化的流程变量 如果出现了修改就会自动更新它们。比如(参考报org.jbpm.examples.serializedobject), 查看一个custom活动行为内的代码片段:

public class UpdateSerializedVariables implements ActivityBehaviour {      public void execute(ActivityExecution execution) {      Set<String> messages = (Set<String>) execution.getVariable("messages");      messages.clear();      messages.add("i");      messages.add("was");      messages.add("updated");    }  }

当事务提交时,用户代码会被调用, 更新消息集合会自动被更新到数据库中。

当从DB读取以序列化格式保存的流程变量时, jBPM会监控反序列化的对象。在事务提交之前, jBPM会反序列化并自动更新变量,如果必要的话。 jBPM会忽略更新反序列化对象,如果其他对象被设置到那个作用域 (这可能是其他类型)。jBPM也会略过更新 那些数值没有发生变化的的反序列化对象。这些检测会查看 如果一个对象被修改了,基于计算再次序列化对象的字节数组, 和从数据库中原来读取的字节数组进行比较。


  评论这张
 
阅读(152)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017