2015-05-08 6 views
1

Если рассматривать этот код S3 ЗагрузитьAWS S3 Java SDK: RequestClientOptions.setReadLimit

val tm: TransferManager = ??? 
val putRequest = new PutObjectRequest(bucketName, keyName, inputStream, metaData) 
putRequest.setStorageClass(storageClass) 
putRequest.getRequestClientOptions.setReadLimit(100000) 
tm.upload(putRequest) 

Что является использование метода setReadLimit? AWS SDK Javadoc содержит следующее описание:

Устанавливает дополнительный предел чтения и сброса, используемый для целей подписания и повторной попытки. Смотрите также: InputStream.mark (интермедиат)

ли мое предположение верно в том, что он должен обеспечить своего рода «контрольных точек», так что если сеть терпит неудачу в середине процесса загрузки, то API будет (внутренне) выполнить повторную попытку из последней помеченной позиции вместо начала файла?

ответ

4

У TransferManager есть поддержка «контрольной точки», как вы описываете, хотя она напрямую не связана с параметром readLimit. S3 позволяет загружать большие объекты в multiple parts, и TransferManager автоматически позаботится об этом для вас для загрузки по certain size. Если загрузка одной части не удалась, базовому AmazonS3Client нужно только повторить загрузку этой отдельной части. Если вы передадите TransferManager a File вместо InputStream, он может даже загрузить несколько частей файла параллельно, чтобы ускорить передачу.

Параметр readLimit используется, когда вы передаете TransferManager (или базовый AmazonS3Client) InputStream вместо File. По сравнению с файлом, который вы можете легко найти, если вам нужно повторить часть загрузки, интерфейс InputStream намного более ограничительный. Чтобы поддерживать повторы при загрузке InputStream, AmazonS3Client использует методы и reset интерфейса InputStream, mark в потоке в начале каждой загрузки и reset, относящийся к знаку, если требуется повторить попытку.

Обратите внимание, что метод меток принимает параметр readlimit и обязан «помнить» столько байтов из InputStream, сколько вы просите об этом заранее. Некоторые InputStreams реализуют mark путем выделения для буферизации базовых данных в памяти, поэтому его можно воспроизвести, если вызван сброс, что делает опасным слепое mark, используя длину загружаемого объекта (что может быть несколько гигабайт). Вместо этого, AmazonS3Client по умолчанию вызывает вызов mark со значением 128 КБ - если ваш InputStream заботится о readlimit, это означает, что AmazonS3Client не сможет повторять запросы, которые сбой после того, как он отправил больше, чем первые 128 КБ.

Если вы используете такой InputStream и хотите выделить больше памяти для буферизации загруженных данных, чтобы AmazonS3Client мог повторить попытки сбоев в процессе загрузки (или, наоборот, если вы хотите использовать меньший буфер и потенциально увидеть больше сбоев), вы можете настроить значение, которое будет использоваться через setReadLimit.

Смежные вопросы