Загрузка AWS S3 Java SDK завершается с ошибкой при отключении пула подключений в Groovy

Я использую Amazon Java SDK (последняя версия - 1.11.147 на момент написания этой статьи) с Groovy (версия Groovy: 2.4.11 JVM: 1.8.0_112 Производитель: Oracle Corporation OS: Mac OS X) для загрузки файлов в S3. Используя инструкции из документации Amazon для Transfer Manager, мне удалось скопировать содержимое из одной корзины в другую. Однако загрузка всегда не выполняется. Я попробовал следующие 3 метода. У меня Grapes загружаются новые версии httpclient и httpcore из-за того, что я прочитал в этом сообщении о переполнении стека Apache PoolingHttpClientConnectionManager выдает исключение недопустимого состояния

@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)

Однако независимо от того, какой метод я пробую, всегда получаю следующую трассировку стека:

Обнаружено: java.lang.IllegalStateException: отключение пула подключений java.lang.IllegalStateException: отключение пула подключений на org.apache.http.util.Asserts.check (Asserts.java:34) на org.apache.http.pool. AbstractConnPool.lease (AbstractConnPool.java:184) по адресу org.apache.http.impl.conn.PoolingHttpClientConnectionManager.requestConnection (PoolingHttpClientConnectionManager.java:251) в com.amazonaws.http: //www.connews.com 76) на com.amazonaws.http.conn. $ Proxy11.requestConnection (Неизвестный источник) на org.apache.http.impl.execchain.MainClientExec.execute (MainClientExec.java:175) на org.apache.http.impl.execchain .ProtocolExec.execute (ProtocolExec.java:184) в org.apache.http.impl.client.InternalHttpClient.doExecute (InternalHttpClient.java:184) в org.apache.http.impl.client.CloseableHttpClient.exepClient (CloseableHttpClient.execute.java : 82) в org.apache.http.impl.client.CloseableH ttpClient.execute (CloseableHttpClient.java:55) на com.amazonaws.http.apache.client.impl.SdkHttpClient.execute (SdkHttpClient.java:72) на com.amazonaws.http.AmazonHttpClient $ RequestExecutor.exe (AmazonExecutor.exe) 1190) по адресу com.amazonaws.http.AmazonHttpClient $ RequestExecutor.executeHelper (AmazonHttpClient.java:1030) по адресу com.amazonaws.http.AmazonHttpClient $ RequestExecutor.doExecute (AmazonHttpClient.mazor.http: //www.executor.doExecute (AmazonHttpClient. .executeWithTimer (AmazonHttpClient.java:716) на com.amazonaws.http.AmazonHttpClient $ RequestExecutor.execute (AmazonHttpClient.java:699) на com.amazonaws.http.AmazonHttpClient $ RequestExecutor.ac .amazonaws.http.AmazonHttpClient $ RequestExecutionBuilderImpl.execute (AmazonHttpClient.java:649) по адресу com.amazonaws.http.AmazonHttpClient.execute (AmazonHttpClient.java:513) по адресу com.amaz3Client. Client.java:4221) на com.amazonaws.services.s3.AmazonS3Client.invoke (AmazonS3Client.java:4168) на com.amazonaws.services.s3.AmazonS3Client.putObject (AmazonS3Client.java:1718) на com.amazonaws.services .s3.AmazonS3 $ putObject.call (Неизвестный источник) ...

В настоящее время я не могу подтвердить, использует ли Groovy обновленные библиотеки httpcomponent или это проблема. В 1.8 JDK установлены httpclient_4.2.6 и httpclient_4.3.5. Будем очень признательны за любые предложения о том, как отстать. Спасибо. -Венсан


person Vincent Jørgensen    schedule 14.06.2017    source источник


Ответы (1)


Я понял. к s3client был прикреплен другой TranferManager в другом месте кода. когда был вызван tx.shutdownNow (), он также закрыл этот TransferManager.

person Vincent Jørgensen    schedule 15.06.2017
comment
как ты решил это? Я тоже получаю это исключение? - person shane lee; 29.08.2017
comment
@shanelee Я перестал передавать ссылку на TransferManager и вместо этого использовал новую ссылку в каждой функции, которая передавала файлы s3. - person Vincent Jørgensen; 13.09.2017
comment
Я согласен с решением @ VincentJørgensen. У меня была та же проблема, что и у меня, когда я повторно использовал клиент S3 в служебной программе, меняя служебную программу для создания нового клиента каждый раз, чтобы устранить эту проблему. - person Scott Bennett-McLeish; 08.06.2019
comment
Такая же проблема здесь, я закрыл transfermanager после загрузки, а затем попытался использовать на нем листобъект. - person niclaslindgren; 08.12.2020