共享业务对象

Draft comment:
This topic is shared by BAW, CP4BA, CP4BASaaS. Last updated on 2025-01-20 10:38
您可以使用共享业务对象来确保在运行时在流程组件之间传递的数据的完整性。 共享业务对象中的数据始终是最新的,因为在使用此数据之前会从数据存储器刷新此数据。 如果您使用共享业务对象,还可以控制在运行的流程和服务中如何传递数据以及如何处理更改。

一般注意事项

您将使用 JavaScript 创建共享业务对象(如常规业务对象):

// Create shared object
tw.local.sharedObject = new tw.object.SharedObject();
tw.local.sharedObject.property = "value";
共享业务对象具有可使用 JavaScript 进行检索的键:

// Retrieve key for shared object
tw.local.sharedObjectKey = tw.local.sharedObject.metadata("key");
log.info("sharedObjectkey: " + tw.local.sharedObjectKey);
您可以使用 JavaScript 根据其键来检索共享业务对象:
// Retrieve shared object by key
var sharedObject2 = new tw.object.SharedObject(tw.local.sharedObjectKey);
log.info("sharedObject2.property: " + sharedObject2.property);
共享业务对象以逻辑方式连接到创建了该对象的流程实例。 如果共享业务对象是在独立于流程启动的人员服务中创建的,该对象将连接到相应的任务。 如果共享业务对象由某个流程变量引用,那么其他流程实例也可以使用该对象。 连接的流程或任务已删除且没有其他流程实例引用共享业务对象时,将自动删除该共享业务对象。 保存了共享业务对象的新版本时,将自动删除不再需要的更旧版本共享业务对象。

共享业务对象中的数据通过引用在流程组件之间传递;在运行时,其他实例可以访问该对象的值。

您可以将数据从一个流程发送到另一个流程,方法是使用消息事件,或者使用共享业务对象的唯一键将数据装入到第二个流程中。

重要信息: 请勿将共享业务对象作为输出返回。 在输出变量中返回共享业务对象会导致局部变量引用新的业务对象实例。 如果此变量还与其他服务或链接的流程一起使用,那么您可能会收到过时的数据。

数据同步

共享业务对象允许同时进行的修改。 例如,两个用户可以在人员服务中查看和修改同一个共享业务对象实例。 当用户触发边界事件时,将保存共享业务对象实例的数据。 但是仅保存每位用户修改的字段。 因此,如果两个用户修改不同的字段,那么两者的更改都会保存。 如果两个用户都修改相同的字段,那么将保存最后一个用户的更新。 除了拥有多个用户之外,您还可能会遇到自动执行步骤的情况,例如,对共享业务对象进行修改的服务器脚本。

缺省情况下,发生以下任何事件时,共享业务对象中的数据会持久存储到数据库并在所有作用域之间同步:
  • 创建了共享对象。
    限制: 如果服务是独立于没有任务的流程实例启动的,那么在创建共享业务对象时不会同步数据。
  • 流程实例的状态为持久存储,并且为流程启用了自动同步。 如果在运行时使用链接流程,那么将采用顶级业务流程定义的设置。
  • 任务或服务实例的状态为持久存储,并且为服务定义启用了自动同步。 如果使用嵌套服务,那么将采用顶级服务器定义的设置。

对于流程和服务实施,您可以指定当共享业务对象在其他实例或任务中被更改时,是否在流程实例中自动更新和保存共享业务对象。 您可以在流程或服务的概述部分中使用业务对象同步设置来控制此行为。 此设置始终针对使用先前版本的基本案例管理功能部件创建的案例类型启用且无法关闭;它绝不会针对 Ajax 服务启用且无法开启。

如果没有针对流程启用自动同步,或者服务实施不支持自动同步,那么您必须对共享业务对象调用 JavaScript save 方法来持久存储对象数据并调用 load 方法来将数据存储器中的最新数据装入到变量中。
// Save the variable data
tw.local.sharedObject.save();

// Load the variable data
tw.local.sharedObject.load();
提示:
  • 如果自动同步并保存了流程和服务中对业务对象的更改,请勿将保存语句包含在脚本中。
  • 基于共享业务对象的活动前置条件需要数据同步,以便在发生更改时可以对前置条件进行重新评估。 对于包含特别活动的流程,请始终启用同步设置。 如果不启用此设置,您必须在服务器脚本中调用 JavaScript loadsave 方法来装入最新的内容或保存更改。

正在运行的流程实例或服务使用顶级流程或服务的同步设置。 链接的流程还使用顶级流程的设置,而无论链接的流程的设置如何。 嵌套服务使用顶级服务的同步设置。

属性类型限制

系统将跟踪对共享业务对象实例所作的更改。 但是,如果共享业务对象实例或其其中一个嵌套复杂类型属性的属性为以下类型,那么无法跟踪更改:
  • 映射
  • XMLDocument
  • XMLElement
  • XMLNodeList

无法识别对此类变量类型的值所作的更改。 例如,无法识别何时向映射添加了条目。 因此,即使显式调用 save () 函数,也不会保存共享业务对象实例。

请考虑使用“记录”业务对象,而不是“映射”业务对象。 它具有相似的功能,且不受此限制的影响。

服务的其他注意事项

外部服务(如 Web Service)和 Advanced Integration Service 的输出共享业务对象会返回原始输入共享业务对象的新副本(通常已更新)。 输出映射引用共享业务对象时,该服务将返回新的共享业务对象。 要在输入映射中返回共享业务对象的更新版本,请参阅输出映射中共享业务对象的各个字段。