搜索更改的实体

使用 search(DataObject) 方法和 ChangeControl DataObject 以从特定检查点开始,查询更改实体的联合存储库。

有关此任务

ChangeControl DataObject 区分更改的实体搜索与一般搜索操作。每个作为搜索结果返回的实体与 changeType 属性关联。

实体 DataObject 的 changeType 属性为可选属性,仅在与更改的实体搜索对应的情况下设置。ChangeType 属性描述发生的更改类型,此更改可为添加新实体、修改现有实体、删除实体或重命名实体。

ChangeType 属性的有效值和字符串常量为 add(针对 CHANGETYPE_ADD)、delete(针对 CHANGETYPE_DELETE)、modify(针对 CHANGETYPE_MODIFY 和 rename(针对 CHANGETYPE_RENAME)。

针对添加的实体、修改的实体和重命名的实体,会返回存储库中的当前实体。 针对删除的实体,仅返回包含外部名称和唯一名称的实体标识。(在 IBM® Tivoli® Directory Server V6.1 和之前的版本,存储库特定 UUID 不作为实体标识的一部分返回,而在 IBM Tivoli Directory Server V6.2 和之后的版本,实体标识包含存储库特定 UUID 和外部名称和唯一名称。)存储库检查点为诊断更改类型和搜索条件。检查点适用于整个存储库。

为了避免将 ChangeControl 传递到无法对其进行处理的适配器,wimconfig.xml 中的每个存储库标识与名为 supportChangeLog 的属性关联。 SupportChangeLog 属性的有效值为:
  • none- 指示此存储库没有更改跟踪支持。如果未设置 supportChangeLog,此值为缺省值。
  • native - 指示 virtual member manager 使用存储库的本机更改跟踪机制以返回更改的实体。
概要文件管理器引用此值,然后将请求传递到相应适配器。如果 supportChangeLog 值为 none,那么不会调用此存储库来检索更改的实体。可使用 createIdMgrLDAPRepository、updateIdMgrLDAPRepository 或 updateIdMgrRepository wsadmin 命令来设置 supportChangeLog 属性。有关这些命令的更多信息,请参阅 IdMgrRepositoryConfig command group for the AdminTask object
LDAP 适配器支持以下存储库:
  • IBM Tivoli Directory Server
  • Active directory
要点: 在支持查询功能的适配器上查询更改实体之前,请确保启用存储库的更改跟踪功能。例如,要启用 IBM Tivoli Directory Server 的更改跟踪,请参阅 IBM Tivoli Directory Server 信息中心中的 Server Utilities, idscfgchglg 主题。

针对 IBM Tivoli Directory Server,还需确保安装了 Authorized Program Analysis Report (APAR) 1IO10107 的修订。

输入和输出数据图样本

考虑以下三个存储库配置了 virtual member manager 应用程序的情境:IBM Tivoli Directory Server、Active Directory 和文件存储库。应用程序与 virtual member manager 同步时,会检索检查点并保存检查点。 此保存的检查点在下一个同步时间间隔使用。以下样本代码检索当前检查点:

DataObject root = com.ibm.websphere.wim.util.SDOHelper.createRootDataObject();
com.ibm.websphere.wim.util.SDOHelper.createControlDataObject(root, WIM_NS_URI, DO_CHANGE_CONTROL);
return service.search(root);

有关此特定示例,在此处说明处理搜索更改实体过程中需要执行的步骤。

  1. 发送空 ChangeControl

    Virtual member manager 客户机应用程序在首次搜索更改的实体期间发送 ChangeControl,而不发送任何检查点。输入数据图如下所示。

    <?xml version="1.0" encoding="UTF-8"?>
    <sdo:datagraph xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:sdo="commonj.sdo" xmlns:wim="http://www.ibm.com/websphere/wim">
      <wim:Root>
        <wim:controls xsi:type="wim:ChangeControl" changeTypes="*"/>
      </wim:Root>
    </sdo:datagraph><?xml version="1.0" encoding="UTF-8"?>
    <sdo:datagraph xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:sdo="commonj.sdo" xmlns:wim="http://www.ibm.com/websphere/wim">
      <wim:Root>
        <wim:controls xsi:type="wim:ChangeControl"/>
      </wim:Root>
    </sdo:datagraph>
  2. 返回具有检查点的 ChangeResponseControl
    1. 根据搜索条件和存储库是否支持更改跟踪,概要文件管理器接口将请求传递到关联适配器。
    2. 每个适配器与在后续搜索期间根据此适配器使用的当前检查点对应。
    3. 概要文件管理器接口合并所有适配器返回的检查点字符串,并将其发送回响应控件。
    在此示例中,由于文件存储库不支持更改请求,因此文件存储库的检查点没有显示在响应控件中。如果 IBM Tivoli Directory Server 具有 20 个更改,Active Directory 具有 40 个更改,生成的输出数据图在此处显示。
    <?xml version="1.0" encoding="UTF-8"?>
    <sdo:datagraph xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:sdo="commonj.sdo" xmlns:wim="http://www.ibm.com/websphere/wim">
      <wim:Root>
        <wim:controls xsi:type="wim:ChangeResponseControl">
          <wim:checkPoint>
            <wim:repositoryId>TDS_LDAP</wim:repositoryId>
            <wim:repositoryCheckPoint>21</wim:repositoryCheckPoint>
          </wim:checkPoint>
          <wim:checkPoint>
            <wim:repositoryId>AD_LDAP</wim:repositoryId>
            <wim:repositoryCheckPoint>41</wim:repositoryCheckPoint>
          </wim:checkPoint>
        </wim:controls>
      </wim:Root>
    </sdo:datagraph>
  3. 发送具有包含检查点的 ChangeControl 的搜索请求

    后续搜索更改实体期间,此合并的检查点会传递回 virtual member manager,且概要文件管理器接口负责将相应检查点传递到相应适配器。

    要从将检查点先前 ChangeResponseControl 复制到输入 ChangeControl,请将以下样本代码添加到应用程序代码,并使用要使用的实际值替换变量

    /**  
     * Get the current checkpoint for the repositories
     * @return DataObject: DataObject with ChangeResponseControl containing the checkpoints
     * for the repositories that support change tracking
     */
    public DataObject searchGetCurrentCheckpoint() throws WIMException 
    {
       DataObject root = com.ibm.websphere.wim.util.SDOHelper.createRootDataObject();
       com.ibm.websphere.wim.util.SDOHelper.createControlDataObject(root, WIM_NS_URI, DO_CHANGE_CONTROL);
       return service.search(root);
    }
    
    /** 
     * Search the changed entities since the checkpoint returned by searchGetCurrentCheckpoint
     * @param prevRoot: DataObject returned from searchGetCurrentCheckpoint
     * @return DataObject: DataObject with changed entities and ChangeResponseControl
     */
    public DataObject searchGetChangedEntities(final DataObject prevRoot) throws WIMException 
    {
       DataObject root = com.ibm.websphere.wim.util.SDOHelper.createRootDataObject();
       DataObject changeCtrl = com.ibm.websphere.wim.util.SDOHelper.createControlDataObject(root, null, DO_CHANGE_CONTROL);
       changeCtrl.setString(SchemaConstants.PROP_SEARCH_EXPRESSION, "@xsi:type='PersonAccount'");                
       changeCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("uid");
       changeCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("cn");
       changeCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("sn");
       changeCtrl.getList(PROP_CHANGETYPES).add(SchemaConstants.CHANGETYPE_ALL);
       com.ibm.websphere.wim.util.SDOHelper.createChangeCtrlFromChangeRespCtrl(root, prevRoot);
       return service.search(root);
    }
      
    /**
     * Method to call searchGetCurrentCheckpoint and searchChangedEntities
     */
    public void search() throws WIMException
    {
      /* Get the current checkpoint */
      DataObject result = searchGetCurrentCheckpoint();
      
      /* Here add, modify, rename, delete some entities */
    
      /* Search for the changed entities since the checkpoint returned by searchGetCurrentCheckpoint */
      result = searchGetChangedEntities(result);
    }

    在上述代码中,search() 方法首先调用 searchGetCurrentChekpoint() 方法检索当前检查点。 SearchGetCurrentCheckpoint() 返回的结果会传递到第二个方法 searchGetChangedEntities()。它使用 SDOHelper.createChangeCtrlFromChangeRespCtrl() 实用程序方法,从 searchGetCurrentCheckpoint 返回的 ChangeResponseControl 获取包含保存的检查点的更新 ChangeControl。

    包含保存的检查点的后续搜索的输入数据图在此处显示:

    <?xml version="1.0" encoding="UTF-8"?>
    <sdo:datagraph xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:sdo="commonj.sdo" xmlns:wim="http://www.ibm.com/websphere/wim">
      <wim:Root>
        <wim:controls xsi:type="wim:ChangeControl" expression="@xsi:type='PersonAccount' and cn='tuser*'">
          <wim:checkPoint>
            <wim:repositoryId>TDS_LDAP</wim:repositoryId>
            <wim:repositoryCheckPoint>21</wim:repositoryCheckPoint>
          </wim:checkPoint>
          <wim:checkPoint>
            <wim:repositoryId>AD_LDAP</wim:repositoryId>
            <wim:repositoryCheckPoint>41</wim:repositoryCheckPoint>
          </wim:checkPoint>
          <wim:changeTypes>add</wim:changeTypes>
        </wim:controls>
      </wim:Root>
    </sdo:datagraph>
  4. 返回具有更新检查点的搜索结果和 ChangeResponseControl。

    如果 IBM Tivoli Directory Server 中添加了三个新实体,Active Directory 中添加了两个新实体,那么生成的输出数据图在此处显示:

    <?xml version="1.0" encoding="UTF-8"?>
    <sdo:datagraph xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:sdo="commonj.sdo" xmlns:wim="http://www.ibm.com/websphere/wim">
      <wim:Root>
        <wim:entities xsi:type="wim:PersonAccount">
          <wim:identifier externalName="cn=tuser1,o=tds" repositoryId="TDS_LDAP" uniqueId="13f1c1c8-ff43-433c-b0ca-02fb5a56b522"
              uniqueName="cn=tuser1,o=tds"/>
          <wim:changeType>add</wim:changeType>
        </wim:entities>
        <wim:entities xsi:type="wim:PersonAccount">
          <wim:identifier externalName="cn=tuser3,o=tds" repositoryId="TDS_LDAP" uniqueId="25641e84-b17b-48ee-b9cb-d7eea2496005"
              uniqueName="cn=tuser3,o=tds"/>
          <wim:changeType>add</wim:changeType>
        </wim:entities>
        <wim:entities xsi:type="wim:PersonAccount">
          <wim:identifier externalName="cn=tuser5,o=tds" repositoryId="TDS_LDAP" uniqueId="a3316b8d-f496-4a5b-93eb-ba59f47aa2ab"
              uniqueName="cn=tuser5,o=tds"/>
          <wim:changeType>add</wim:changeType>
        </wim:entities>
        <wim:entities xsi:type="wim:PersonAccount">
          <wim:identifier externalName="CN=tuser4,DC=vmm-server11,DC=in,DC=ibm,DC=com"
              repositoryId="AD_LDAP" uniqueId="855c13b14a2e5e448af0699d4b2aaf47" uniqueName="CN=tuser4,o=ad"/>
          <wim:changeType>add</wim:changeType>
        </wim:entities>
        <wim:entities xsi:type="wim:PersonAccount">
          <wim:identifier externalName="CN=tuser2,DC=vmm-server11,DC=in,DC=ibm,DC=com"
              repositoryId="AD_LDAP" uniqueId="725199db56ac8342b7c6a08ae3cb93e3" uniqueName="CN=tuser2,o=ad"/>
          <wim:changeType>add</wim:changeType>
        </wim:entities>
        <wim:controls xsi:type="wim:ChangeResponseControl">
          <wim:checkPoint>
            <wim:repositoryId>TDS_LDAP</wim:repositoryId>
            <wim:repositoryCheckPoint>24</wim:repositoryCheckPoint>
          </wim:checkPoint>
          <wim:checkPoint>
            <wim:repositoryId>AD_LDAP</wim:repositoryId>
            <wim:repositoryCheckPoint>43</wim:repositoryCheckPoint>
          </wim:checkPoint>
        </wim:controls>
      </wim:Root>
    </sdo:datagraph

IBM Tivoli Directory Server 和 Active Directory 之间搜索结果中的不同点

在 IBM Tivoli Directory Server 和 Active Directory 中搜索更改的实体的结果有所区别。在此处说明两个重要不同点。

重命名操作
  • IBM Tivoli Directory Server:

    返回具有 changeType rename 的重命名实体。 要标识初始实体,virtual member manager 客户机应用程序必须关联旧实体和新实体的 uniqueID(从 ibm-entryUUID 属性获取)。

  • Active Directory:

    返回具有 changeType modify 的重命名实体。 当 Virtual member manager 客户机应用程序遇到在其副本中不存在的专有名称 (DN) 的修改操作时,可标识重命名操作。然而,基于针对还未在应用程序副本中的新 DN,也会报告修改操作。 即使在相同同步循环中添加和修改实体,也会报告修改操作。因此,virtual member manager 客户机应用程序必须关联旧实体和新实体的唯一标识(从 Active Directory 的 objectGUID 属性获取)。 如果未找到 uniqueID,那么此操作为添加操作,否则为针对现有实体的重命名操作。

相同同步循环中对实体进行多次修改
  • IBM Tivoli Directory Server:

    更改实体的最后版本报告次数与在同步循环中对实体进行的更改次数相同,此实体具有 changeType modify。例如,如果在相同同步循环中,对实体进行了 4 次修改,那么修改实体的最后版本作为具有 changeType modify 的更改实体返回 4 次。此种情况的例外为稍后会在相同同步循环中删除实体。在这种情况下,忽略在删除实体之前对实体进行的任何其他操作,且不会返回给 virtual member manager 应用程序。

    每次搜索更新的实体时,即使在相同同步循环中修改实体,然后删除了实体,仍会更新 virtual member manager 维护的属性高速缓存。

  • Active Directory:

    仅返回实体的最后更新。 例如,如果在相同同步循环中添加了实体,然后删除了实体,那么 virtual member manager 客户机会接收不在此客户机副本中的实体的 delete changeType。在这种情况下,virtual member manager 必须包含忽略更改通知的逻辑。

    每次搜索更改的实体时,均会更新 virtual member manager 维护的属性高速缓存。然而,如果在相同同步循环中从存储库更改了实体,然后删除了实体,那么不会更新属性高速缓存。

有关端到端样本代码,请参阅主题搜索已更改实体的样本代码用于搜索已更改和已删除实体的样本代码



使用条款 | 反馈