【问题标题】:Deleting many managed objects selectd by fragment name删除片段名称选择的许多托管对象
【发布时间】:2018-06-13 17:54:05
【问题描述】:

我想删除许多按片段类型选择的托管对象。里面有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);

【问题讨论】:

    标签: cumulocity


    【解决方案1】:

    通过调用moc.get(2000).allPages(),您已经获得了一个迭代器,当您对其进行迭代时,它会根据需要查询后续页面。

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 当然,我理解潜力,但是,在某些用例中需要它。如何修改上面的代码以删除所有元素,而不仅仅是最大 2000?
      • 我对 SDK 不是很熟悉,但在 API 上,您只需抓取下一页,直到最后。不知道SDK中是否可以直接使用这种机制。
      • sdk(在我的例子中是 8.15.0)的行为很奇怪。如果选择了大量(10000)个元素,上面的代码甚至会删除超过 2000 个。但是,只有当 e
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2023-03-29
        • 1970-01-01
        • 2019-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-08
        • 2011-05-01
        • 1970-01-01
        相关资源
        最近更新 更多