web-dev-qa-db-ja.com

AmazonS3:警告の取得:S3AbortableInputStream:すべてのバイトがS3ObjectInputStreamから読み取られなかったため、HTTP接続を中止します

ここに私が得ている警告があります:

S3AbortableInputStream:すべてのバイトがS3ObjectInputStreamから読み取られなかったため、HTTP接続が中断されました。これはおそらくエラーであり、最適な動作にならない可能性があります。必要なバイトのみをレンジGETでリクエストするか、使用後に入力ストリームをドレーンします。

リソースでtryを使用しようとしましたが、S3ObjectInputStreamはこのメソッドを介して閉じないようです。

 try (S3Object s3object = s3Client.getObject(new GetObjectRequest(bucket, key));
      S3ObjectInputStream s3ObjectInputStream = s3object.getObjectContent();
      BufferedReader reader = new BufferedReader(new InputStreamReader(s3ObjectInputStream, StandardCharsets.UTF_8));
    ){
  //some code here blah blah blah
 }

また、以下のコードを試して明示的に閉じましたが、それも機能しません:

S3Object s3object = s3Client.getObject(new GetObjectRequest(bucket, key));
S3ObjectInputStream s3ObjectInputStream = s3object.getObjectContent();

try (BufferedReader reader = new BufferedReader(new InputStreamReader(s3ObjectInputStream, StandardCharsets.UTF_8));
){
     //some code here blah blah
     s3ObjectInputStream.close();
     s3object.close();
}

任意の助けをいただければ幸いです。

PS:S3からファイルの2行しか読み取っていないのに、ファイルにさらにデータがあります。

12
Chirag Sejpal

他の媒体を介して答えを得た。ここで共有:

この警告は、ファイル全体を読み取らずにclose()を呼び出したことを示します。 S3はまだデータを送信しようとしており、接続を悲しい状態のままにしているため、これは問題です。

ここには2つのオプションがあります。

  1. 接続を再利用できるように、入力ストリームから残りのデータを読み取ります。
  2. S3ObjectInputStream.abort()を呼び出して、データを読み取らずに接続を閉じます。接続は再利用されないため、接続を再作成する次のリクエストでパフォーマンスが低下します。ファイルの残りを読むのに長い時間がかかる場合、これは価値があるかもしれません。
16
Chirag Sejpal

Chirag Sejpalの回答(オプション#1で詳述)に例を追加するには、次を使用して、入力ストリームを閉じる前に入力ストリームから残りのデータを読み取ります。

S3Object s3object = s3Client.getObject(new GetObjectRequest(bucket, key));

try (S3ObjectInputStream s3ObjectInputStream = s3object.getObjectContent()) {
  try {
    // Read from stream as necessary
  } catch (Exception e) {
    // Handle exceptions as necessary
  } finally {
    while (s3ObjectInputStream != null && s3ObjectInputStream.read() != -1) {
      // Read the rest of the stream
    }
  }

  // The stream will be closed automatically by the try-with-resources statement
}
0
DPG