`
actuutuu
  • 浏览: 4950 次
文章分类
社区版块
存档分类
最新评论

JBPM之Variables变量

    博客分类:
  • JBPM
阅读更多

第 7 章 Variables变量

流程变量在流程外部,通过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也会略过更新 那些数值没有发生变化的的反序列化对象。这些检测会查看 如果一个对象被修改了,基于计算再次序列化对象的字节数组, 和从数据库中原来读取的字节数组进行比较。

7.4. 声明变量

(从 jBPM 4.4 开始)

变量可以被直接定义在流程定义中(jPDL)。这些变量 会在流程实例启动时被创建。这里可能有多于一个的变量定义。

这儿有几种可能方式来声明变量:

  • 声明 字符串 变量,使用静态文本初始化
    <variable name="declaredVar" type="string" init-expr="testing declared variable"/>
                
  • 声明 自定义 变量,使用EL进行初始化
    <variable name="declaredVar" type="long" init-expr="#{anotherVar}"/>
                
  • 声明 自定义 变量,使用可持久化的类进行初始化
    <variable name="declaredVar" type="serializable" >
       <object class="org.jbpm.examples.variable.declared.HistoryVariable" />
    </variable>
                

就像上面演示的那样,变量值可以通过两种方式设置:使用init-expr属性 或通过内嵌的init标识符(object元素)在变量标签中。

注意,每个流程定义只能使用一个赋值方式。

表 7.1. variable 元素的属性:

属性 类型 默认值 是否必须 描述
name 字符串   必须 变量的名称
type 字符串   必须 变量的类型,必须引用jbpm.variable.types.xml中定义的类型
init-expr 字符串(EL表达式)   可选 变量的值,这个属性或内嵌元素必须设置
init-expr-type 字符串 UEL 可选 定义表达式执行的语言
history boolean false 可选 表示变量是否需要保存到历史库中 - 默认为false。 更多历史的信息,请参考第 7.5 节 “变量历史”

表 7.2. variable的内嵌元素

元素 数目 描述
   
object 1 变量的值,它是一个自定义对象,这个元素或init-expr属性必须被指定。    

7.5. 变量历史

(从 jBPM 4.4 开始)

变量可以被标记为作为历史记录保存。这意味着,当流程实例结束, 它的运行阶段的信息被删除,历史细节依然会被保存。

有两种方式可以启用变量的历史功能:

  • 通过公共 API ExecutionService:
    • void createVariable(String executionId, String name, Object value, boolean historyEnabled);
    • void createVariables(String executionId, Map<String, ?> variables, boolean historyEnabled);
  • 通过变量定义
    <variable name="declaredVar" type="string" init-expr="testing declared variable" history="true"/>
                

当前,所有变量历史都会作为字符串值保存。 变量(无论什么类型)会被转换成一个字符串的值,使用toString()方法。 在自定义对象的情况,它们需要重写toString()方法来提供字符串的内容, 这些内容会作为历史记录保存下来。这就提供了一个简单的方法, 可以根据变量值来进行搜索的功能。

可以通过 HistoryService 方法来访问历史变量:

  • Object getVariable(String processInstnceId, String name);
  • Map<String, Object> getVariables(String processInstnceId, Set<String> variableNames);
  • Set<String> getVariableNames(String processInstnceId);
分享到:
评论

相关推荐

    JBPM深入解析之变量设计

    **JBPM深入解析之变量设计** JBPM(Java Business Process Management)是一款开源的工作流程管理系统,它提供了业务流程的建模、部署、执行和监控等功能。在JBPM中,变量是流程实例中的数据容器,用于存储流程运行...

    JBPM流程引擎资料

    变量(Variables)是流程中的数据容器,文档对变量作用域、变量类型和如何更新持久化流程变量等方面进行了阐述。变量声明、变量历史记录也是在流程设计中必须要考虑的问题。 最后,文档还提到了脚本化(Scripting),这...

    jbpm使用简单示例

    - **变量(Variables)**:存储流程实例中所需数据的对象,可以是业务数据或流程状态。 **学习价值** 此示例对于初学者来说具有很高的学习价值,因为它直观地展示了jbpm如何与实际业务场景相结合。通过分析代码,...

    深入浅出jBPM.1-6章测试代码_jbpm-test.rar

    《深入浅出jBPM:1-6章测试代码详解》 jBPM,全称为Java Business Process Management,是一款开源的工作流管理...希望这篇关于《深入浅出jBPM:1-6章测试代码详解》的内容能对你在jBPM的学习之旅中提供有价值的指导。

    jBPM4学习总结

    任务泳道与任务变量(Task Lane and Task Variables) - **任务泳道**:用于区分不同角色的任务,帮助可视化流程中的任务分配。 - **任务变量**:存储任务相关的数据,可以影响任务的处理和流程的流转。 #### 9. ...

    jbpm4实例源码,可直接运行

    6. **变量(Variables)**:在流程执行过程中,可以定义并操作变量,用于存储流程状态和数据。查看源码,你将了解如何设置和获取变量值。 7. **事件(Events)**:jbpm4支持多种类型的事件,如开始事件、结束事件、...

    jBPM教学视频(01配置开发环境.zip)

    - **变量**(Variables):存储流程运行时的数据。 - **事件**(Events):响应特定情况的发生,如开始事件、结束事件等。 - **规则引擎**:jBPM集成了Drools,用于执行基于规则的逻辑。 通过这个视频系列,学习者...

    jbpm5第一个例子

    原因是,只在sample.bpmn的 Variables中加入变量money是不够的,还要在ProcessMain中加入上面一段才行。 试了一下,如果只在ProcessMain中加入上面一段,但在sample.bpmn中不定义,也是会抛错的。 现在jbpm5的资料...

    jBPM4开发指南.pdf

    - **变量(Variables)**:存储与流程实例相关的数据,用于在整个流程中传递信息。 - **事件(Events)**:用于响应特定条件或情况,如开始事件、结束事件、信号事件等。 - **节点(Nodes)**:流程图中的每一个...

    jBPM_用户开发手册-中文版

    4. **变量(Variables)**:存储在流程实例中的数据,用于传递和存储流程执行中的信息。 5. **事件(Events)**:流程中的特殊节点,用于处理特定条件或状态的改变,如开始事件、结束事件和异常事件。 6. **服务...

    jBPM表结构ppt

    3. **变量表(Variables)** - `JBPM_VARIABLEINSTANCE`: 存储流程实例中的变量信息,包括变量ID、变量值和关联的流程实例ID。变量可以是流程执行过程中的任意数据。 4. **节点表(Nodes)** - `JBPM_NODE...

    jbpm的数据库说明

    - **Variables**:流程实例中的变量存储在`jbpm_variable`表中,用于保存流程运行时的动态数据。 - **Event Logs**:jbpm记录流程执行过程中的事件,如节点的进入和离开,这有助于跟踪和审计。这些事件存储在`jbpm_...

    jbpm工作流管理系统

    - **上下文变量 (Variables)**:流程执行过程中会涉及到各种变量的设置和获取。JBPM提供了`setVariable`和`getVariable`方法来管理这些变量。 - **信号触发 (Signal)**:当达到流程定义中的某个节点时,可以通过发送...

    JBoss_jBPM_jPDL用户开发手册_3.2.3.pdf 中文-(转)zhangym

    - **变量(Variables)**:存储流程实例中的数据,可以是输入、输出或内部状态。 **3. 开发手册的重要性** 《JBoss_jBPM_jPDL用户开发手册_3.2.3.pdf》作为开发者的重要参考资料,详细介绍了如何使用jBPM和jPDL...

    jbpm jpdl 帮助文档pdf版

    - **上下文变量**:在流程执行过程中,如何管理和使用变量。 - **应用场景**:传递数据、记录状态等。 #### 3.4 Task assignment example - **任务分配**:展示如何在流程中自动或手动地分配任务给参与者。 - **...

    JBPM_6.0.1_API(最新API)

    - **实体(Entities)**: 包括流程实例(Process Instance)、任务(Task)和变量(Variables),它们构成了流程运行的基础元素。 - **执行服务(Execution Service)**: 提供了启动、终止流程实例,以及查询、控制...

    jBPM4.3用户指南

    #### 七、Variables变量 - **概念**: 介绍了jPDL中变量的基本概念。 - **作用域**: 解释了变量的作用域及其管理方法。 - **类型**: 列举了不同类型的变量及其用途。 - **持久化**: 介绍了如何更新持久化的流程变量...

    jbpm4服务接口方法汇总

    以上介绍了JBPM框架中`ProcessEngine`提供的核心服务之一——`RepositoryService`和`ExecutionService`的主要功能及其使用方法。通过这两个服务接口,开发者能够有效地管理流程定义的生命周期,并控制流程实例的执行...

    jbpm会签.zip

    9. **流程变量(Process Variables)**:在会签过程中,可能需要共享某些信息,流程变量就是存储这类信息的地方,它们可以在整个流程实例中被访问和修改。 10. **扩展与定制**:jbpm提供了丰富的API和插件机制,...

Global site tag (gtag.js) - Google Analytics