删除由片段名称选择的许多托管对象

Deleting many managed objects selectd by fragment name

我想删除许多按片段类型选择的托管对象。其中有 2000 多个元素。不幸的是,我无法通过一次函数调用来删除所有内容。我必须多次调用此函数,直到我全部删除。如何以足够的方式删除托管对象列表?未定义页面大小没有帮助...

这是我当前的功能:

    InventoryFilter filter = new InventoryFilter();
    filter.byFragmentType("xy_fragment");

    ManagedObjectCollection moc = inventoryApi.getManagedObjectsByFilter(filter);

    int count = 0;
    // max page size is 2000
    for (ManagedObjectRepresentation mo : moc.get(2000).allPages()) {
        if (mo.get("c8y_IsBinary") != null) {
            binariesApi.deleteFile(mo.getId());
        } else {
            inventoryApi.delete(mo.getId());
        }

        LOG.debug(count + " remove: " + mo.getName() + ", " + mo.getType());
        count++;
    }

    LOG.info("all objectes removed, count:" + count);

库存不允许批量删除API所以你循环对象的方法是正确的方法。

批量删除在其他 API 上已经是一个危险的工具,但在库存 API 上,它会让您有可能通过一次调用意外删除所有数据(因为所有与 managedObject 关联的数据也会在删除 managedObject 时被删除)。 这就是它不可用的原因。

我通过调用方法解决了这个问题,直到再也找不到元素。这是不好但我没有别的想法。

    public synchronized void removeManagedObjects(String deviceTypeKey) {
    int count = 0;
    do {
        count = deleteManagedObjectes(deviceTypeKey);
    }while(count > 0);
}

private int deleteManagedObjectes(String deviceTypeKey) {
    InventoryFilter filter = new InventoryFilter();
    filter.byFragmentType("xy_fragment");

    ManagedObjectCollection moc = inventoryApi.getManagedObjectsByFilter(filter);
    int count = 0;

    if(moc == null) {
        LOG.info("ManagedObjectCollection are NULL");
        return count;
    }

    for (ManagedObjectRepresentation mo : moc.get(2000).allPages()) {
        if (mo.get("c8y_IsBinary") != null) {
            binariesApi.deleteFile(mo.getId());
        } else {
            inventoryApi.delete(mo.getId());
        }

        LOG.debug(count + " remove: " + mo.getName() + ", " + mo.getType());
        count++;
    }

    LOG.info("all objectes removed, count:" + count);
    return count;
}

通过调用 moc.get(2000).allPages(),您已经获得了一个迭代器,可以在迭代时按需查询后续页面。

您遇到的问题是由于从您迭代的同一个列表中删除元素引起的。您从第一页删除元素,但是一旦从服务器查询第二页,它就不再包含预期的元素,因为您已经删除了第一页。现在所有元素都按您的页面大小向前移动。

您可以通过首先创建要删除的所有元素的本地副本来避免所有这些情况:

List<ManagedObjectRepresentation> allObjects = Lists.newArrayList( moc.get(2000).allPages())
for (ManagedObjectRepresentation mo : allObjects) {
  //delete here   
}