Изтеглянето на файлове ›3Gb от S3 е неуспешно с SocketTimeoutException: времето за четене изтече

AWS Java SDK 1.9.3

При изтегляне на много големи файлове (~3Gb) от AWS S3 в приложението за сървър на Java получавам SocketTimeoutException от време на време, както следва:

Caused by: com.amazonaws.AmazonClientException: Unable to store object contents to disk: Read timed out
 at com.amazonaws.services.s3.internal.ServiceUtils.downloadObjectToFile(ServiceUtils.java:270)
 at com.amazonaws.services.s3.internal.ServiceUtils.retryableDownloadS3ObjectToFile(ServiceUtils.java:344)
 at com.amazonaws.services.s3.transfer.TransferManager$2.call(TransferManager.java:737)
 ... 4 more
Caused by: java.net.SocketTimeoutException: Read timed out
 at java.net.SocketInputStream.socketRead0(Native Method)
 at java.net.SocketInputStream.read(SocketInputStream.java:152)
 at java.net.SocketInputStream.read(SocketInputStream.java:122)
 at sun.security.ssl.InputRecord.readFully(InputRecord.java:442)
 at sun.security.ssl.InputRecord.readV3Record(InputRecord.java:554)
 at sun.security.ssl.InputRecord.read(InputRecord.java:509)
 at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:927)
 at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:884)
 at sun.security.ssl.AppInputStream.read(AppInputStream.java:102)
 at org.apache.http.impl.io.AbstractSessionInputBuffer.read(AbstractSessionInputBuffer.java:198)
 at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:178)
 at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:137)
 at com.amazonaws.internal.SdkFilterInputStream.read(SdkFilterInputStream.java:73)
 at com.amazonaws.event.ProgressInputStream.read(ProgressInputStream.java:151)
 at com.amazonaws.internal.SdkFilterInputStream.read(SdkFilterInputStream.java:73)
 at com.amazonaws.internal.SdkFilterInputStream.read(SdkFilterInputStream.java:73)
 at com.amazonaws.internal.SdkFilterInputStream.read(SdkFilterInputStream.java:73)
 at com.amazonaws.event.ProgressInputStream.read(ProgressInputStream.java:151)
 at java.security.DigestInputStream.read(DigestInputStream.java:161)
 at com.amazonaws.services.s3.internal.DigestValidationInputStream.read(DigestValidationInputStream.java:59)
 at com.amazonaws.internal.SdkFilterInputStream.read(SdkFilterInputStream.java:73)
 at java.io.FilterInputStream.read(FilterInputStream.java:107)
 at com.amazonaws.services.s3.internal.ServiceUtils.downloadObjectToFile(ServiceUtils.java:265)
 ... 6 more

Изтеглям файлове от S3, като използвам 4 нишки, всички нишки използват един и същ екземпляр на TransferManager. Както споменах по-рано, използвам AWS SDK 1.9.3 и получавам такива изключения само от време на време. Кодът е следният:

...
Download d = transferManager.download(currentBucket, remoteFileName, new File(tmpName));
d.waitForCompletion();
...

Въпрос на SDK ли е? Може би от v1.9.3?

И има ли някакво решение освен увеличаване на socketTimeout за ClientConfiguration?


person Yury    schedule 28.01.2015    source източник
comment
Имам същия проблем. Използвам AWS S3 Android SDK 2.1.7 и моите файлове имат около 10 MB. Получихте ли отговор за решаването му?   -  person Felipe Antonio Cardoso    schedule 07.02.2015
comment
Все още няма решение за този проблем, освен промяна на времето за изчакване.   -  person Yury    schedule 09.02.2015
comment
Здравей @Yury, можеш ли, моля, да ми покажеш как да променя времето за изчакване?   -  person Caaarlos    schedule 09.02.2015
comment
Здравей @Caaarlos. Ето как мога да направя в AWS SDK 1.9.3: ClientConfiguration config = new ClientConfiguration(); config.setConnectionTimeout(connectionTimeout); config.setSocketTimeout(readTimeout); AmazonS3 s3 = new AmazonS3Client(credentials, config);   -  person Yury    schedule 10.02.2015
comment
Благодаря Юри, вашето решение работи засега.   -  person Felipe Antonio Cardoso    schedule 10.02.2015
comment
@Yury можеш ли да публикуваш своето решение като официален отговор на това?   -  person Cel Skeggs    schedule 29.03.2015


Отговори (1)


Ето как мога да направя в AWS SDK 1.9.3:

ClientConfiguration config = new ClientConfiguration(); 
config.setConnectionTimeout(connectionTimeout);
config.setSocketTimeout(readTimeout); 
AmazonS3 s3 = new AmazonS3Client(credentials, config);
person Yury    schedule 29.03.2015
comment
Какво е времето за изчакване по подразбиране? - person samthebest; 11.11.2015
comment
времето за изчакване по подразбиране, както в 1.10.x, е 50 секунди както за изчакване на сокет, така и за връзка. - person Samuel García; 21.06.2016
comment
Бих искал да видя v2 версия на това! - person ndtreviv; 11.08.2020