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

时间:2018-05-31 09:13:46

标签: cumulocity

我想删除由片段类型选择的许多托管对象。其中有超过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);

3 个答案:

答案 0 :(得分:0)

库存API上不允许批量删除,因此循环访问对象的方法是正确的方法。

批量删除在其他API上已经是一个危险的工具,但在库存API上,它会让您有可能只用一次调用就意外删除所有数据(因为删除了与托管对象关联的所有数据) of managedObject)。 这就是它无法使用的原因。

答案 1 :(得分:0)

我通过调用方法解决了这个问题,直到找不到任何元素为止。 不好,但我没有其他想法。

    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;
}

答案 2 :(得分:0)

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

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

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

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