[英]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();
因為這將失敗,如果有例外
否則它會起作用。
最終代碼:
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.