मैं स्प्रिंग बूट 2.1.4.रिलीज के साथ <aws.java.sdk>1.11.637</aws.java.sdk> का उपयोग कर रहा हूं।

कोड : जो S3 चेतावनी का कारण बनता है (यहां मुझे S3Object से केवल getUserMetadata तक पहुंचना है और संपूर्ण वस्तु सामग्री नहीं)

private Map<String, String> getUserHeaders(String key) throws IOException {
    Map<String, String> userMetadata = new HashMap<>();
    S3Object s3Object = null;
    try {
      s3Object = s3Client.getObject(new GetObjectRequest(bucketName, key));
      userMetadata.putAll(s3Object.getObjectMetadata().getUserMetadata());
    } finally {
      if (s3Object != null) {
        s3Object.close();
      }
    }
    return userMetadata;
  }

आउटपुट : जब भी s3Object.close (); लागू किया जाता है, तो मुझे नीचे संदेश के साथ कंसोल पर चेतावनी दिखाई देती है:

{"msg":"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.","logger":"com.amazonaws.services.s3.internal.S3AbortableInputStream","level":"WARN","component":"demo-app"}

त्रुटि के कारण की मेरी जांच:

मैंने आगे की जाँच की आंतरिक/S3AbortableInputStream.java#L173-L187" rel="nofollow noreferrer">https://github.com/aws/aws-sdk-java/blob/c788ca832287484c327c8b32c0e2b0090a74c23d/aws-java-sdk/mainjava /com/amazonaws/services/s3/internal/S3AbortableInputStream.java#L173-L187 और यह कहता है कि अगर _readAllBytes() सच नहीं है (मेरे मामले में) जहां मैं केवल उपयोगकर्ता मेटाडेटा प्राप्त करने के लिए S3Object का उपयोग कर रहा हूं और पूरी स्ट्रीम सामग्री नहीं) तो हमेशा चेतावनी होगी।

प्रश्न:

ए) कैसे S3Object.close S3AbortableInputStream.close का आह्वान करने के लिए अग्रणी है जैसा कि मैं S3Object के अंदर कोड मानता हूं। /services/s3/model/S3Object.java#L222" rel="nofollow noreferrer">https://github.com/aws/aws-sdk-java/blob/c788ca832287484c327c8b32c0e2b0090a74c23d/aws-java-sdk-s3 main/java/com/amazonaws/services/s3/model/S3Object.java#L222 केवल SdkFilterInputStream.close के माध्यम से is.close(); का आह्वान करें

बी) जब मैं केवल मेटा डेटा पढ़ने के लिए S3Object का उपयोग करना चाहता हूं, न कि संपूर्ण ऑब्जेक्ट सामग्री को पढ़ने के लिए मुझे इन चेतावनियों से कैसे छुटकारा पाना चाहिए।

2
Arun Kumar 10 अक्टूबर 2019, 12:28

1 उत्तर

सबसे बढ़िया उत्तर

शायद S3 ऑब्जेक्ट के लिए केवल मेटाडेटा पुनर्प्राप्त करने के लिए डिज़ाइन किए गए इस API फ़ंक्शन का उपयोग करने का प्रयास करें:

ObjectMetadata getObjectMetadata(GetObjectMetadataRequest getObjectMetadataRequest)
                          throws SdkClientException,
                                 AmazonServiceException

तो अपना कोड इसमें बदलें:

ObjectMetadata s3ObjectMeta = null;
s3ObjectMeta = s3Client.getObjectMetadata(new GetObjectMetadataRequest(bucketName, key));
userMetadata.putAll(s3ObjectMeta.getUserMetadata());

2
Ashaman Kingpin 10 अक्टूबर 2019, 15:45