在运行时如何在 BPD 组件之间传递变量

在运行时,业务数据通过使用变量在业务流程定义 (BPD) 组件之间传递。根据涉及的组件,数据通过值或通过引用来传递。

变量会捕获业务数据。如果业务数据是简单类型(例如“字符串”),那么变量包含业务数据的值。如果业务数据是复杂类型,那么该变量是对包含多个值的对象的引用。

变量可以通过引用或值来传递,如下表中所示。
表 1. 如何传递变量
调用 传递方式
简单类型 案例属性、复杂业务对象或共享业务对象
BPD 活动 链接 BPD 引用(复杂业务对象、共享业务对象)
BPD 活动 客户端人员服务 值(复杂业务对象)

具有引用的值(共享业务对象)

BPD 活动 其他服务 值(复杂业务对象)

具有引用的值(共享业务对象)

案例类型活动 链接 BPD 值(案例属性)

引用(复杂业务对象、共享业务对象)

案例类型活动 客户端人员服务 值(案例属性、复杂业务对象)

具有引用的值(共享业务对象)

案例类型活动 其他服务 值(案例属性、复杂业务对象)

具有引用的值(共享业务对象)

客户端人员服务 嵌套服务 值(案例属性、复杂业务对象)

具有引用的值(共享业务对象)

其他服务 嵌套服务 值(案例属性)

引用(复杂业务对象、共享业务对象)

BPD、案例类型和服务引用了其变量。 复杂变量从 BPD 或案例类型传递到服务时,会将该变量的深度副本从 BPD 或案例类型空间传输到服务空间,然后服务会获取对该副本的引用。类似地,复杂变量从服务传递到 BPD 或案例时,会将该变量的深度副本从服务空间传输到 BPD 或案例类型空间,然后 BPD 或案例类型会获取对该副本的引用。

服务更改现有复杂变量的值时,会通过将整个复杂变量替换为服务中的深度副本来将更改的值传回 BPD 或案例类型。如果替换的变量原先是从外部流程(BPD 或案例类型)通过值传递的,那么内部和外部流程不再访问同一变量。因此,对内部流程的更改不会反映在外部流程中。

通过引用传递的变量
流程中的大部分数据交互是通过引用传递的(从 BPD 到 BPD,在案例类型活动与链接的 BPD 或子流程之间,或者从服务到服务)。因此,大多数情况下,在位置之间传递同一对象。此外,对该对象的更改发生在所有级别。
通过值传递的变量
BPD 或案例类型与服务之间的变量是通过值传递的。变量通过值从 BPD 或案例类型传递到底层服务时,该服务中对该变量进行的更改在调用 BPD 或案例中不可视。要使变量对调用者可视,您必须将其作为输出传回调用者。
通过具有引用的值传递的变量
要使变量通过具有引用的值进行传递,必须通过使用 save 方法或者 BPD 或服务的“概述”部分中的自动同步共享业务对象设置来设置业务对象的同步。如果将一个变量定义为系统生成的案例文件夹变量或者共享业务对象类型,那么会从数据存储器刷新其值。

共享业务对象是通过具有引用的值传递的。这意味着您所作的更改将保存并传播到使用相同数据的其他实例。在 BPD 或服务中必须启用自动同步共享业务对象设置以启用自动保存和数据同步。

例如,某个共享对象通过具有引用的值从某个 BPD 传递到两个不同的服务。BPD 和服务各自包含业务对象的单独副本。第一个服务完成时,共享对象值将自动持久存储到数据存储器。第二个服务启动时,将从数据存储器自动装入共享对象值。因此,尽管 BPD 和两个服务引用单独的对象,这些对象的值也会通过数据存储器进行更新,然后服务会对当前数据进行操作。

有关共享业务对象的信息,请参阅在 Process Designer 中创建定制业务

示例
外部流程具有一个指向 NameValuePair 对象 NVP1 的引用 tw.local.pair。 外部流程将 .pair 引用传递到内部流程:
Outer process -> NVP1
Inner process -> NVP1
对任一流程的更改都将影响另一个流程。
内部流程将 .pair 引用传递到服务。将会创建 NVP1 的副本 NVP2,并且会将副本的引用传递到服务。
Outer process -> NVP1
Inner process -> NVP1
Service -> NVP2
服务退出并输出 .pair 引用,该引用映射回内部流程 .pair 引用的变量。将创建 NVP2 的副本 NVP3,并且会将引用传回内部流程。
Outer process -> NVP1
Inner process -> NVP3
NVP3 的更改未反映在 NVP1 中。

如果您希望服务修改 BPD 中的顶级变量,请使用嵌入式服务器脚本将服务结果存储在临时变量中,并将其成员复制到原始变量或共享业务对象。子 BPD 完成之前,将不更新父 BPD。

传递变量的准则

由于运行时的变量处理方式,请遵循以下准则: