如何检查AmazonS3Client连接是否处于活动状态

4
我希望开发一个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;
}

参考以下代码:您可以使用catch(Exception ex){ex.printStackTrace();}作为所有情况下相同的操作,因为它会捕获所有其他从“ Exception”继承的异常。 - Paul C
3个回答

4

如果有人遇到与我相同的问题而苦恼,我会分享我的经验。

我尝试了以下方法:

s3Client.doesBucketExist("my-bucket")

我希望选择这种方法会更好地满足我的需求,因为我不需要列出存储桶中的所有对象,只想知道输入的存储桶名称是否正确以及凭据(S3访问密钥ID和S3机密访问密钥)是否正确。

检查存储桶名称的方法有效,因为该方法将返回true或false,无论存储桶是否存在,但是如果凭据错误,则始终将返回true,这使得此检查相当无用。

在这里描述的错误:

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

所以,我最终在AWS控制台中添加了“ListBucket”权限并使用了该方法。

s3Client.listBuckets();

如果发生以下情况,这个操作将失败并抛出异常:

  • 存储桶不存在
  • 访问密钥ID无效
  • 秘密访问密钥无效

否则,它将正常工作。

最终代码:

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

3
List<Bucket> bucketList = null;
bucketList = s3Client.listBuckets();

如果bucketList的大小为null,则连接不活动。


感谢您的回复,@supriya!我的put对象失败了,但列出存储桶是有效的。我已经为此苦恼了几个小时了! - Tony Fraser
如果bucketList的大小为null,你是指“bucketList”为null还是大小为零?因为大小不能为null。 - anon
这对我很有效,谢谢。如果有人可以使用这些信息,我想补充一下,在Google Cloud Storage中,通常最好将您存储桶中的Blob列出来,因为用户通常没有列出所有存储桶的权限。在S3中,API仅返回用户有权查看的那些存储桶。 - MarianP

2

在我的情况下,我使用以下命令对S3进行了ping测试:

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

如果出现问题,它将抛出异常。构造函数中的最后一个数字非常重要,因为它只会带来一个元素,而不是所有的元素。
更新:正如弗朗西斯科所说,使用0作为参数也可以。

1
我已经使用更新的ListObjectsV2Async方法测试了这种方法,通过将要检索的元素数量传递为0,它也可以正常工作。 - Francesco D.M.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接