Here's the warning that I am getting:
S3AbortableInputStream:Not all bytes were read from the S3ObjectInputStream, aborting HTTP connection. This is likely an error and may result in sub-optimal behavior. Request only the bytes you need via a ranged GET or drain the input stream after use.
I tried using try with resources but S3ObjectInputStream doesn't seem to close via this method.
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 }
I also tried below code and explicitly closing but that doesn't work either:
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(); }
Any help would be appreciated.
PS: I am only reading two lines of the file from S3 and the file has more data.
I ran into the same problem and the following class helped me
@Data @AllArgsConstructor public class S3ObjectClosable implements Closeable { private final S3Object s3Object; @Override public void close() throws IOException { s3Object.getObjectContent().abort(); s3Object.close(); } }
and now you can use without warning
try (final var s3ObjectClosable = new S3ObjectClosable(s3Client.getObject(bucket, key))) { //same code }
Got the answer via other medium. Sharing it here:
The warning indicates that you called close() without reading the whole file. This is problematic because S3 is still trying to send the data and you're leaving the connection in a sad state.
There's two options here:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With