我正在开发一个系统,利用 jclouds 在亚马逊云上实例化一堆节点。
当我需要知道我已经创建的节点时,我使用了 computeService.listNodes()。对于 listNodes 的每次调用,我都会创建一个对象 computeService,如下所示:
Properties overrides = new Properties();
overrides.setProperty(AWSEC2Constants.PROPERTY_EC2_AMI_QUERY, "image-id=" + image);
ComputeServiceContext context = new ComputeServiceContextFactory()
.createContext(PROVIDER,
Configuration.get("AMAZON_ACCESS_KEY_ID"),
Configuration.get("AMAZON_SECRET_KEY"),
ImmutableSet.<Module> of(), overrides);
computeService = context.getComputeService();
通常它可以工作,但是当我对 computeService.listNodes() 进行多个并发调用时,执行失败。
在这样的执行中,我在 createContext 行的某些线程中遇到了异常。附加了完整的堆栈跟踪。
让我感到困惑的是,我编写了一个带有循环的小程序来实例化多个计算服务,而且我没有遇到任何麻烦。
我会错误地使用 JClouds API 吗?JClouds 不支持并发调用吗?还是对 AWS 调用有某种限制?(上一段表明这些问题的答案是“否”,但我现在无法考虑其他选择)。
重要信息:我的代码从 REST 调用运行到使用 apache cxf 设置的独立本地服务器。
这是负责设置服务器的类:https ://github.com/choreos/choreos_middleware/blob/master/ServiceDeployer/src/main/java/org/ow2/choreos/npm/rest/NPMServer.java 。
堆栈跟踪的一些相关部分:
1) Error in custom provider, java.lang.reflect.UndeclaredThrowableException
while locating org.jclouds.ec2.config.EC2RestClientModule$RegionIdToZoneId
Caused by: java.lang.reflect.UndeclaredThrowableException
at $Proxy98.describeAvailabilityZonesInRegion(Unknown Source)
at org.jclouds.ec2.config.EC2RestClientModule$RegionIdToZoneId.get(EC2RestClientModule.java:152)
Caused by: java.util.concurrent.TimeoutException
at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:258)
at java.util.concurrent.FutureTask.get(FutureTask.java:119)
at org.jclouds.concurrent.config.ExecutorServiceModule$AddToStringFuture.get(ExecutorServiceModule.java:234)
2) Error in custom provider, org.jclouds.http.HttpResponseException: ec2.ap-northeast-1.amazonaws.com connecting to POST https://ec2.ap-northeast-1.amazonaws.com/ HTTP/1.1
while locating org.jclouds.ec2.config.EC2RestClientModule$RegionIdToZoneId
Caused by: org.jclouds.http.HttpResponseException: ec2.ap-northeast-1.amazonaws.com connecting to POST https://ec2.ap-northeast-1.amazonaws.com/ HTTP/1.1
at org.jclouds.http.internal.BaseHttpCommandExecutorService$HttpResponseCallable.call(BaseHttpCommandExecutorService.java:183)
Caused by: java.net.UnknownHostException: ec2.ap-northeast-1.amazonaws.com
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:175)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:384)
OBS:堆栈跟踪中的“at org.ow2.choreos.npm.cloudprovider.AWSCloudProvider.getClient(AWSCloudProvider.java:53)”行是“createContext”行。
谢谢你,莱昂纳多·莱特