2016-07-29 8 views
0

Ich brauche ein Servlet, um Dateien von Amazon S3-Servern zurückzugeben. Nur der Server verfügt über die Anmeldeinformationen für den Zugriff. Der S3-Bucket ist nicht öffentlich. Ich kann das nicht ändern. Mir wurde gesagt, dass ich Datenströme benutzen soll, aber sie sind so langsam. Zum testen habe ich ein kleines Projekt mit Thumbnails und wenn man auf eines klickt öffnet sich ein neues Tab mit dem ganzen Bild. Ein 5 MB-Bild dauert etwa eine Minute, um geladen zu werden. Das langsam.Servlet Lesen von Amazon S3 so langsam

Die Funktion, die von S3 liest und gibt den Datenstrom:

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(); 
    } 
} 

Antwort

1

Ich fand die Antwort. Das Problem war der Logger. Wir verwenden log4j und es wurde auf debug gesetzt, sodass die gesamte Ablaufverfolgung des Streams in die Konsole geschrieben wurde. Nur falls es jemand anderem passiert, hier ist der Link, wo sie sagen, dass es in der Produktion vermieden werden sollte: https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/java-dg-logging.html#verbose-wire-logging

Und ich begann auch mit der Transfermanager als Saravanakumar v sagte, scheint etwas schneller zu sein.

zum Beispiel ich diesen an dieser Probe Antwort IP-to-country.bin heruntergeladen Blick hatte während debug auf

war
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
+0

Thx, ich werde es versuchen, die Antwort, wenn Werke für dieses Problem zu genehmigen;) –

+0

Ich war in den Ferien, tut mir leid, dass ich so lange gebraucht habe, um noch einmal zu antworten. Es hat das Problem nicht gelöst, es ist sogar etwas langsamer mit TransferManager. Das Problem ist, dass es ein Anruf ist, den ich nicht kontrollieren kann, er muss einmal jede Datei aufgerufen werden und warten bis dieser beendet ist, um den nächsten zu starten, so dass die meiste Nützlichkeit des TransferManagers verloren geht. Thx sowieso. –