抽取Vcenter数据之抽取100条以外的额外所有数据

遇到的问题

当我们利用Vsphere Web SDK获取Vsphere数据的时候,当资源信息大于100条的时候,我们利用最基本的API的时候只能抽取到了100条数据。例如一个Vcenter管理了1000个虚拟机,当我们用SDK去获取所有虚拟机的时候,我们利用最基本的API只能获取到100个虚拟机信息,其余的是获取不到的。那么这个问题怎么解决呢?这个时候我们就该用到另一个高级的方法来配合基本的API来完成所有数据的抽取工作。以下信息是我个人做的简单的总结,只为大家提供一个简单的思路,具体的完整代码就不方便展示出来了。如果有问题可以下边留言给我。

最基本的API来抽取最多100条数据


Map<ManagedObjectReference, Map<String, Object>> result = conn.getMoref().inContainerByType(
				conn.getServiceContent().getRootFolder(), "VirtualMachine", new String[] { "name" });
				

public Map<ManagedObjectReference, Map<String, Object>> inContainerByType(ManagedObjectReference container,
                                                                              	String morefType, String[] strings) throws InvalidPropertyFaultMsg, 										RuntimeFaultFaultMsg {
        return inContainerByType(container, morefType, strings, new RetrieveOptions());
}



public Map<ManagedObjectReference, Map<String, Object>> inContainerByType(ManagedObjectReference container,
                                                                              String morefType, String[]
																					  morefProperties, RetrieveOptions
																					  retrieveOptions)
            throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg {
        //这个方法就是获取云平台数据的。但是他的返回的个数是100个,不是所有的数据
        RetrieveResult rslts = containerViewByType(container, morefType, retrieveOptions,
                morefProperties);

        List<ObjectContent> oCont = rslts.getObjects();

        Map<ManagedObjectReference, Map<String, Object>> tgtMoref = new HashMap<ManagedObjectReference, Map<String,
				Object>>();
        if (oCont != null) {
            for (ObjectContent oc : oCont) {
                Map<String, Object> propMap = new HashMap<String, Object>();
                List<DynamicProperty> dps = oc.getPropSet();
                if (dps != null) {
                    for (DynamicProperty dp : dps) {
                        propMap.put(dp.getName(), dp.getVal());
                    }
                }
                tgtMoref.put(oc.getObj(), propMap);
            }
        }
        return tgtMoref;
}


基本API配合高级API抽取全部信息数据

Map<ManagedObjectReference, Map<String, Object>> result = conn.getMoref().inContainerByType(
				conn.getServiceContent().getRootFolder(), "VirtualMachine", new String[] { "name" });
}



public Map<ManagedObjectReference, Map<String, Object>> inContainerByType(ManagedObjectReference container,
                                                                              	String morefType, String[] strings) throws InvalidPropertyFaultMsg, 										RuntimeFaultFaultMsg {
        return inContainerByType(container, morefType, strings, new RetrieveOptions());
}


 public Map<ManagedObjectReference, Map<String, Object>> inContainerByType(ManagedObjectReference container,
                                                                              String morefType, String[]
																					  morefProperties, RetrieveOptions
																					  retrieveOptions)
            throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg {
        RetrieveResult rslts = containerViewByType(container, morefType, retrieveOptions,
                morefProperties);

        List<ObjectContent> oCont = rslts.getObjects();

        //为了收集所有数据进行的源代码改动地方,这个就是配合基本API的高级API,继续获取其余剩下的全部数据信息
        String token = null;
        if (rslts != null && rslts.getToken() != null) {
            token = rslts.getToken();
        }
        while (token != null && !token.isEmpty()) {
            rslts = vimPort.continueRetrievePropertiesEx(serviceContent.getPropertyCollector(),
                    token);
            token = null;
            if (rslts != null) {
                token = rslts.getToken();
                if (rslts.getObjects() != null && !rslts.getObjects().isEmpty()) {
                    oCont.addAll(rslts.getObjects());
                }
            }
        }
        //改动结束
        Map<ManagedObjectReference, Map<String, Object>> tgtMoref = new HashMap<ManagedObjectReference, Map<String,
				Object>>();
        if (oCont != null) {
            for (ObjectContent oc : oCont) {
                Map<String, Object> propMap = new HashMap<String, Object>();
                List<DynamicProperty> dps = oc.getPropSet();
                if (dps != null) {
                    for (DynamicProperty dp : dps) {
                        propMap.put(dp.getName(), dp.getVal());
                    }
                }
                tgtMoref.put(oc.getObj(), propMap);
            }
        }
        return tgtMoref;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值