2016-07-29 2 views
0

Мне нужен сервлет, чтобы возвращать файлы с серверов Amazon S3. Только сервер имеет учетные данные для доступа, ведро S3 не является общедоступным. Я не могу это изменить. Мне сказали использовать потоки данных, но они настолько медленны. Чтобы проверить, у меня есть небольшой проект с эскизами, и когда вы нажимаете на него, открывается новая вкладка с полным изображением. Изображение 5 МБ занимает около минуты, чтобы загрузить. Это медленно.Чтение сервлета от Amazon S3 настолько медленное

функция, которая считывает из S3 и возвращает поток данных:

public void downloadDirectlyFromS3(String s3Path, String fileName, HttpServletResponse response) { 
    AmazonS3 s3Client = new AmazonS3Client(new ProfileCredentialsProvider()); 
    s3Client.setEndpoint(S3ENDPOINT); 

    S3Object s3object = s3Client.getObject(new GetObjectRequest(s3Path, fileName)); 

    byte[] buffer = new byte[5 * 1024 * 1024]; 

    try { 
     InputStream input = s3object.getObjectContent(); 
     ServletOutputStream output = response.getOutputStream(); 
     for (int length = 0; (length = input.read(buffer)) > 0;) { 
      output.write(buffer, 0, length); 
     } 
     output.close(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

ответ

1

Я нашел ответ. Проблема заключалась в регистрации. Мы используем log4j, и он был настроен на отладку, поэтому вся трасса потока была написана на консоли. Только в случае, если это происходит с кем-то еще, вот ссылка, где они говорят, что следует избегать производства: https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/java-dg-logging.html#verbose-wire-logging

И я также начал использовать TransferManager, как saravanakumar v сказал, кажется, немного быстрее.

, например, я имел этот IP-к-country.bin загруженную посмотреть на этот ответ образца во время отладки был на

2017-05-23 12:06:21,770 Wire (Wire.java:86) DEBUG - http-outgoing-0 << "[0xf0][0x1]BGY[0xb][0x0][0x1]ITY[0xb][0x10][0x1]I" 
2017-05-23 12:06:21,824 Wire (Wire.java:72) DEBUG - http-outgoing-0 << "RY[0xb] [0x1]CHY[0xb]0[0x1]DEY[0xb]@[0x1]KZY[0xb]P[0x1]ITY[0xb]`[0x1]ESY[0xb][0x80][0x1]PLY[0xb][0xa0][0x1]GEY[0xb][0xb0][0x1]TJY[0xb][0xc0][0x1]DEY[0xb][0xd0][0x1]CHY[0xb][0xe0][0x1]CZY[0xc][0x0][0x1]GBY[0xc][0x10][0x1]ESY[0xc] [0x1]RUY[0xc]0[0x1]SKY[0xc]@[0x1]RUY[0xc]P[0x1]UZY[0xc]`[0x1]RUY[0xc]p[0x1]MDY[0xc][0x80][0x1]ITY[0xc][0x90][0x1]GBY[0xc][0xa0][0x1]ITY[0xc][0xc0][0x1]UAY[0xc][0xe0][0x1]SAY[0xc][0xf0][0x1]RUY[\r][0x0][0x1]NOY[\r] [0x1]HUY[\r]0[0x1]FRY[\r]@[0x1]DEY[\r]P[0x1]ESY[\r]`[0x1]HUY[\r]p[0x1]ESY[\r][0x80][0x1]GBY[\r][0xa0][0x1]DEY[\r][0xb0][0x1]ATY[\r][0xc0][0x1]DEY[\r][0xd0][0x1]RUY[\r][0xe0][0x1]SEY[0xe][0x0][0x1]NOY[0xe][0x10][0x1]RUY[0xe] [0x1]ESY[0xe]0[0x1]RUY[0xe]@[0x1]CHY[0xe]P[0x1]NGY[0xe]`[0x1]AZY[0xe]p[0x1]DEY[0xe][0x80][0x1]GBY[0xe][0x90][0x1]DEY[0xe][0xb0][0x1]GBY[0xe][0xc0][0x1]RUY[0xe][0xd0][0x1]HRY[0xe][0xe0][0x1]ATY[0xe][0xf0][0x1]RUY[0xf][0x0][0x1]ATY[0xf][0x10][0x1]RUY[0xf] [0x1]ESY[0xf]0[0x1]RUY[0xf]@[0x1]GBY[0xf]P[0x1]FRY[0xf]`[0x1]MTY[0xf]p[0x1]GBY[0xf][0x80][0x1]RUY[0xf][0xa0][0x1]EUY[0xf][0xb0][0x1]KZY[0xf][0xc0][0x1]RUY[0xf][0xd0][0x1]ITY[0xf][0xe0][0x1]BEY[0xf][0xf0][0x1]SEY[0x10][0x0][0x1]FRY[0x10][0x10][0x1]RUY[0x10] [0x1]BEY[0x10]0[0x1]GBY[0x10]@[0x1]MKY[0x10]`[0x1]DKY[0x10]p[0x1]ATY[0x10][0x80][0x1]RSY[0x10][0x90][0x1]ESY[0x10][0xa0][0x1]DEY[0x10][0xb0][0x1]CZY[0x10][0xc0][0x1]SEY[0x10][0xd0][0x1]GBY[0x10][0xe0][0x1]CYY[0x10][0xf0][0x1]ESY[0x11][0x0][0x1]NOY[0x11][0x10][0x1]DEY[0x11] [0x1]PLY[0x11]0[0x1]BGY[0x11]@[0x1]SEY[0x11]P[0x1]LTY[0x11]`[0x1]RSY[0x11]p[0x1]RUY[0x11][0x80][0x1]NLY[0x11][0x90][0x1]TRY[0x11][0xa0][0x1]RUY[0x11] 
2

Использование TransferManager API - http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/transfer/TransferManager.html будет решить эту проблему.

+0

Thx, я буду стараться, и если одобрит ответ работы по этой проблеме;) –

+0

Я был в отпуске, жаль, что я так долго должен был ответить. Это не решило проблему, это даже немного медленнее с TransferManager. Проблема в том, что это вызов, который я не могу контролировать, он должен вызываться один раз в каждом файле и ждать, пока тот не закончит, чтобы запустить следующий, так что большая часть полезности TransferManager теряется. Thx в любом случае. –

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