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