每个对插件管理器的调用都与一个唯一标识 (UID) 相关联。
使用 UID,登录、检测无限递归以及 preExit 和 postExit 方法调用之间的状态保留都变得更容易,如下面的场景中所示。
以下场景显示了发生无限递归的情况:
- 步骤 1:应用程序调用 virtual member manager 的 create() API,并且插件管理器的 preExit 方法在 create() API 一开始就进行了调用。
- 步骤 2:插件管理器调用 JMS 通知订户的 preExit 方法。
- 步骤 3:插件管理器调用 ABCSoftGroup 修改订户的 preExit 方法。
- 步骤 4:插件管理器调用 XYZSoftGroup 修改订户的 preExit 方法。
- 步骤 5:XYZSoftGroup 修改订户的 preExit 方法调用 virtual member manager create() API,这会引起递归并导致无限循环。
但是,在第一步中,插件管理器的 preExit 方法将一个 UID 插入了数据对象的 Context 对象。UID 的值是 List 对象,在第二次调用期间新的 UID 将附加到该对象。
订户有责任检查以避免无限递归,原因如下:
- 对于插件管理器中执行的每次检查,可避免性能问题。
- 根据数据对象的上下文,在订户级别可能最好使用递归子集。
可以将相同 UID 用于各种订户调用之间的状态保留。如果订户调用新主题发射器,那么必须将该 UID 复制回新数据对象,以避免无限递归。通过状态保留,订户可以将 preExit 方法调用与 postExit 方法调用相关联。