7

S3 から csv テキスト ファイルを読み取り、その各行を分散キューに送信して処理しようとしています。

それを読み取ろうとすると、読み取られているファイルのさまざまな時点で (さまざまな実行で) "java.net.SocketException: Socket is closed" Exception が発生します。これはコードです:

      AmazonS3 s3 = new AmazonS3Client(new PropertiesCredentials(MyClass.class.getResourceAsStream("myCredentials.properties")));

        String bucketName = "myBucket";
        String key = "myFile";  

        S3Object object = s3.getObject(new GetObjectRequest(bucketName, key));

        InputStream in = object.getObjectContent();

        BufferedReader readerS3 = new BufferedReader(new InputStreamReader(in, Charset.forName(fileInfo.getEncoding())));

        try {
            String line = null;
            while ((line = readerS3.readLine()) != null) {
                // Sending the line to a distributed queue
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

この問題を解決する方法について何か考えはありますか?

アップデート:

この例外は、メソッドを 2 回目に実行したときに発生します。プログラム全体を停止して再度実行すると、最初にメソッドを実行すると問題なく動作します。

4

6 に答える 6

6

AmazonS3質問へのコメントで「jsn」が示唆しているように、問題は次のように構成する必要があることですClientConfiguration

ClientConfiguration config = new ClientConfiguration();
config.setSocketTimeout(0);
AmazonS3 s3 = new AmazonS3Client(/* credentials */, config);
于 2012-12-19T12:36:37.370 に答える
1

おそらく、「in」ではなくfinallyでreaderS3を閉じる必要があります。つまり、ラップされた子を閉じることができる最も外側のオブジェクトを閉じます。

最初に「in」を閉じた場合、InputStreamReader と BufferedReader はまだ開いており、それらがラップするオブジェクトで何かを行おうとすると、既に閉じられています。

于 2012-10-06T08:54:04.613 に答える
0

ソケットの入力ストリームまたは出力ストリーム、あるいはそれらの周りのストリーム/リーダー/ライターラッパーを閉じると、ソケットが閉じられます(したがって、それぞれ出力ストリームまたは入力ストリームが閉じられます)。

于 2012-07-11T22:38:21.373 に答える
0

私は同じ問題を抱えていましたが、この件名は問題を解決するのに役立ちました: S3 Java クライアントは、「Content-Length で区切られたメッセージ本文の途中終了」または「java.net.SocketException ソケットが閉じられました」で多くの失敗をします。

基本的に、すべてのファイルに対して新しい S3Client オブジェクトを作成していましたが、ある時点でこのオブジェクトはガベージ コレクションされました。その代わりに、クラスを変換して Singleton を使用するようにしました。

private static AmazonS3 s3Client;
  static {
    s3Client = new AmazonS3Client(new BasicAWSCredentials(AWSKey, AWSSecretKey));
  }

  public AmazonS3 getService() {
    return s3Client;
  }
于 2016-12-05T18:23:17.587 に答える