aws java sdk v2

aws版本是2.21.40

部署到tomcat9上運行一段時間就會卡死,client 無法創建,可能是pool滿了,加入

報錯如下:the client has "experienced" too many recent call failures

1.請求太多,並發量太大

2.s3client用的apache client加入配置如下

ClientOverrideConfiguration clientOverrideConfiguration =
             ClientOverrideConfiguration.builder()
                             .retryPolicy(RetryPolicy.builder().numRetries(0).build())
                             .build();

3.最重要的是加入配置maxConnections(300),另外更改查詢文件是否存在

HeadObjectRequest req = HeadObjectRequest.builder()
                 .bucket(Constants.awsPath.bucketName)
                 .key(keyName)
                 .build();
         try {
             return s3Client.headObject(req);
         } catch (NoSuchKeyException e) {
             return null;
         }

4.预签名设置加入

s3Presigner = DefaultS3Presigner
             .builder().s3Client(s3Client)

應該是設置url存活時間太長了,導致服務端在頻繁請求時不再分配Token,導致client無法請求,最後設置預簽名b.signatureDuration(Duration.ofMinutes(1));

目前觀察中

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
AWS S3 Java SDK V2 中,可以通过实现 `software.amazon.awssdk.core.sync.ResponseTransformer` 接口并重写其中的 `onResponse()` 和 `exceptionOccurred()` 方法来实现 TransferListener。在 `onResponse()` 方法中,您可以获得已经传输的字节数和需要传输的总字节数,并且可以通过它们来计算传输的进度。 以下是一个示例代码片段,展示了如何实现 TransferListener: ``` public class S3TransferListener implements ResponseTransformer<GetObjectResponse, GetObjectResponse> { private final long totalBytes; private final TransferListener listener; private long transferredBytes = 0; public S3TransferListener(long totalBytes, TransferListener listener) { this.totalBytes = totalBytes; this.listener = listener; } @Override public GetObjectResponse transformResponse(GetObjectResponse response) { // Do something with the response return response; } @Override public void onResponse(GetObjectResponse response) { try (InputStream contentStream = response.responseBody()) { byte[] buffer = new byte[8192]; int bytesRead; while ((bytesRead = contentStream.read(buffer)) != -1) { // Update the transferred bytes transferredBytes += bytesRead; // Calculate the progress percentage int progress = (int) ((double) transferredBytes / totalBytes * 100); // Notify the listener of the progress update listener.progressChanged(ProgressEvent.builder() .bytesTransferred(transferredBytes) .totalBytes(totalBytes) .percentTransfered(progress) .build()); } } catch (IOException e) { throw new RuntimeException(e); } } @Override public void exceptionOccurred(Throwable error) { // Handle the exception } } ``` 在上面的代码中,`transferredBytes` 变量跟踪已经传输的字节数,`totalBytes` 变量是需要传输的总字节数。在 `onResponse()` 方法中,我们迭代读取传输的字节,并更新 `transferredBytes` 变量,计算进度百分比,最后通过 `listener.progressChanged()` 方法通知进度变化。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值