私は、jclouds を利用して、Amazon クラウドで多数のノードをインスタンス化するシステムを開発しています。
作成済みのノードを知る必要がある場合は、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 行の一部のスレッドで例外が発生しました。完全なスタック トレースが添付されます。
私を困惑させているのは、複数の computeServices をインスタンス化するためのループを含む小さなプログラムを作成したことです。問題はありませんでした。
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。
呼び出しを受け取るクラスは次のとおりです: https://github.com/choreos/choreos_middleware/blob/master/ServiceDeployer/src/main/java/org/ow2/choreos/npm/rest/NodesResource.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」行です。
ありがとう、レオナルド・レイテ