簡體   English   中英

如何檢查 AmazonS3Client 連接是否處於活動狀態

[英]how to check if AmazonS3Client connection is active or not

我希望開發一個 Singletone AmazonS3Client 來為我的應用程序提供服務,以將文件上傳到 Amazon S3 服務器。 但是,我找不到如何檢查連接是否處於活動狀態以及是否能夠上傳存儲桶。

如果連接斷開,是否會拋出特定的異常? 還是在一定時間后連接斷開?

任何答案都會有所幫助。

這是我的代碼片段:

private static final AmazonS3Client s3Client;
static {
  AWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey);
  s3Client = new AmazonS3Client(awsCredentials);
}

private static boolean writeFile(AmazonS3Client s3Client, String fileName, File file, Boolean publicRead){
  try {
    PutObjectRequest p = new PutObjectRequest(bucketName, fileName, file);
    if (publicRead)
      p.setCannedAcl(CannedAccessControlList.PublicRead);
    s3Client.putObject(p);
    System.out.println("URL: " + S3_BASE_URL + fileName);
    return true;
  } catch (AmazonServiceException ase){
    ase.printStackTrace();
  } catch (AmazonClientException ace) {
    ace.printStackTrace();
  } catch (Exception ex){
    ex.printStackTrace();
  } catch (Throwable e) {
    e.printStackTrace();
  }
  return false;
}
List<Bucket> bucketList = null;
bucketList = s3Client.listBuckets();

如果bucketList大小為null,則連接不活動

為了防止其他人為我遇到的同樣問題而苦苦掙扎,我發布了迄今為止的經驗。

我嘗試過:

s3Client.doesBucketExist("my-bucket")

因為它更適合我的需要,因為我不需要列出存儲桶中的所有對象,只是想知道輸入的存儲桶名稱是否正確以及憑據(s3訪問密鑰id和s3秘密訪問密鑰)是否是正確。

檢查存儲桶名稱是否有效,因為無論存儲桶是否存在,此方法都將返回true或false,但如果憑據錯誤,它將始終返回true,這使得此檢查非常無用。

Bug描述如下:

https://forums.aws.amazon.com/thread.jspa?threadID=77397

所以我最終在AWS控制台中添加了IAM中的“ListBucket”權限並使用了

s3Client.listBuckets();

因為這將失敗,如果有例外

  • 桶不存在
  • 訪問密鑰ID無效
  • 秘密訪問密鑰無效

否則它會起作用。

最終代碼:

 try {
        final AmazonS3Client s3Client = new AmazonS3Client(new BasicAWSCredentials(s3AccessKeyId, s3SecretAccessKey));
        s3Client.listObjects(s3Bucket);
        return true;
    } catch (Exception ex) {
        return false;
    }

就我而言,我已使用以下行對 S3 執行 ping 操作:

amazonS3.listObjects(new ListObjectsRequest(s3Bucket, null, null, null, 1));

如果有任何問題,它會拋出異常。 構造函數中的最后一個數字非常重要,因為它只會帶來一個元素,而不是那里的所有元素。

更新:正如 Francesco 所說,使用 0 作為參數也可以

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM