Groovy(Groovyバージョン:2.4.11 JVM:1.8)でAmazon Java SDK(この記事の時点では最新バージョン1.11.147)を使用しています。 0_112ベンダー:Oracle Corporation OS:Mac OS X)を使用して、S3にファイルをアップロードします。 Amazonのドキュメントの指示に従ってTransfer Managerを使って、1つのバケットから別のバケットに内容をコピーすることができました。ただし、アップロードは常に失敗します。私は次の3つの方法を試みました。AWS S3 Java SDKのアップロードがGroovyの「接続プールのシャットダウン」で失敗する
:私はブドウが原因で、私はしかし、関係なく、私がしようとしている方法で、私は常に次のスタックトレースを取得していない、このスタックオーバーフローポスト Apache PoolingHttpClientConnectionManager throwing illegal state exception@Grapes([ @Grab(group='com.amazonaws', module='aws-java-sdk', version='1.11.147'), // https://mvnrepository.com/artifact/org.apache.commons/commons-compress @Grab(group='org.apache.commons', module='commons-compress', version='1.13'), // https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient @Grab(group='org.apache.httpcomponents', module='httpclient', version='4.5.3'), // https://mvnrepository.com/artifact/org.apache.httpcomponents/httpcore @Grab(group='org.apache.httpcomponents', module='httpcore', version='4.4.6') ]) // creds is String saying which ~/.aws/credentials profile to use def credentials = new ProfileCredentialsProvider(creds) def s3client = AmazonS3ClientBuilder.standard(). withCredentials(credentials). withRegion(region). build() def tx = TransferManagerBuilder.standard(). withS3Client(s3client). build() def config_path = "/path/to/my/root" def dir = "key_path" def f = new File("${config_path}/${dir}/") // Method 1, upload whole directory in one call def mfu = tx.uploadDirectory(data_bucket, dir, f, true) mfu.waitForCompletion() // <-- throws exception, w/o this line, just doesn't upload, but script continues // Method 2, upload each file separately def ld ld = { File file -> file.listFiles().each { g -> if (g.isDirectory()) { ld.call(g) } else { def key = g.toString().substring(config_path_length) def fu = tx.upload(data_bucket, key, g) def fu = tx.upload(data_bucket, key, g) fu.waitForCompletion() // <-- throws exception, w/o this line, just doesn't upload, but script continues } } } ld.call(f) // Finally Method 3, avoiding TransferManager altogether, and call putObject directly on each file def ld ld = { File file -> file.listFiles().each { g -> if (g.isDirectory()) { ld.call(g) } else { def key = g.toString().substring(config_path_length) def fu = tx.upload(data_bucket, key, g) s3client.putObject(new PutObjectRequest(data_bucket, key, g)) // <-- throws exception } } } ld.call(f)
で読んだののHTTPClientとhttpcoreの新バージョンをつかむ必要があり
がキャッチ:java.lang.IllegalStateException:接続プールは java.lang.IllegalStateExceptionをシャットダウン:接続プールは org.apacheでorg.apache.http.util.Asserts.check(Asserts.java:34)でシャットダウン。 http.pool.AbstractConnPool.lease(AbstractConnPool.java:184)012に com.amazonaws.http.conn.ClientConnectionManagerFactory $ Handler.invoke(ClientConnectionManagerFactory.java:76)com.amazonawsで でorg.apache.http.impl.conn.PoolingHttpClientConnectionManager.requestConnection(PoolingHttpClientConnectionManager.java:251) 。 http.conn。$ Proxy11.requestConnection(不明なソース) でorg.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:175) org.apache.http.impl.execchain.ProtocolExecで。実行 org.apache.http.impl.client.CloseableHttpClient.executでorg.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)で(ProtocolExec.java:184) E(CloseableHttpClient.java:82) でorg.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:55) com.amazonaws.http.apache.client.impl.SdkHttpClient.execute(で com.amazonaws.http.AmazonHttpClient $ RequestExecutor.executeHelper(AmazonHttpClient.java:1030) での com.amazonaws.http.AmazonHttpClient $ RequestExecutor.executeOneRequest(AmazonHttpClient.java:1190) でSdkHttpClient.java:72) com.amazonaws.http.AmazonHttpClient $ RequestExecutor.doExecute(AmazonHttpClient.java:742) でcom.amazonaws.http.AmazonHttpClient $ RequestExecutor.executeWithTimer(AmazonHttpClient.java:716) com.amazonawsで com.amazonaws.http.AmazonHttpClient $ RequestExecutor.access $ 500から com.amazonaws.http.AmazonHttpClient $ RequestExecutor.execute(AmazonHttpClient.java:699) (AmazonHttpClient.java:667) で。 http.AmazonHttpClient $ RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:649) でcom.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:513) com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Clientで 。 java:4221) at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4168) at com.amazonaws.services.s3.AmazonS3Client.putO (AmazonS3Client.java:1718) com.amazonaws.services.s3.AmazonS3 $ putObject.call(不明なソース) ...
現時点では、groovyが更新されたhttpcomponentライブラリを使用しているかどうか、または問題があるかどうかを確認することができません。 1.8 JDKには、httpclient_4.2.6とhttpclient_4.3.5がインストールされています。追いつかないようにするための提案は非常に高く評価されます。ありがとうございました。 -Vincent
これをどのように解決しましたか?私もこの例外を受け取りますか? –
@shanelee TransferManagerの参照を回避し、代わりにs3ファイルを転送する各関数で新しいものを使用しました。 –