状态保留和避免无限递归

每个对插件管理器的调用都与一个唯一标识 (UID) 相关联。

使用 UID,登录、检测无限递归以及 preExitpostExit 方法调用之间的状态保留都变得更容易,如下面的场景中所示。

图 1。 避免无限递归
避免无限递归

以下场景显示了发生无限递归的情况:

  • 步骤 1:应用程序调用虚拟成员管理器的 create() API,并且插件管理器的 preExit 方法在 create() API 一开始就进行了调用。
  • 步骤 2:插件管理器调用 JMS 通知订户的 preExit 方法。
  • 步骤 3:插件管理器调用 ABCSoftGroup 修改订户的 preExit 方法。
  • 步骤 4:插件管理器调用 XYZSoftGroup 修改订户的 preExit 方法。
  • 步骤 5:XYZSoftGroup 修改订户的 preExit 方法调用虚拟成员管理器create() API,这会引起递归并导致无限循环。

但是,在第一步中,插件管理器的 preExit 方法将一个 UID 插入了数据对象的 Context 对象。 UID 的值是 List 对象,在第二次调用期间新的 UID 将附加到该对象。

订户有责任检查以避免无限递归,原因如下:

  • 对于插件管理器中执行的每次检查,可避免性能问题。
  • 根据数据对象的上下文,在订户级别可能最好使用递归子集。

可以将相同 UID 用于各种订户调用之间的状态保留。 如果订户调用新主题发射器,那么必须将该 UID 复制回新数据对象,以避免无限递归。 通过状态保留,订户可以将 preExit 方法调用与 postExit 方法调用相关联。