遇到的问题
当我们利用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;
}