java - AWS 的 AsyncClients in Java 线程安全且持久吗?

标签 java multithreading amazon-web-services

我打算向 SNS 发送消息,然后我发现了一个 AmazonSNSClient。我试过了。

AWSCredentials credentials = new DefaultAWSCredentialsProviderChain()
  .getCredentials();
AmazonSNSClient client = new AmazonSNSClient(credentials);

我让我的服务实例持有这个客户端以使其永远存在,但在某个时刻,错误开始发生。

com.amazonaws.AmazonServiceException: 
The security token included in the request is expired 
(Service: AmazonSNS; Status Code: 403; Error Code: ExpiredToken; 
Request ID: d4bf427c-5b60-568b-a91c-0ea88356bc69)

显然,这是因为 AmazonSNSClient 的设计目的不是为了保持活力和多次使用。 AmazonSNSAsyncClient 似乎适合这种用法。

我的问题是 AmazonSNSAsyncClient 是线程安全的吗? AmazonSNSAsyncClient 是否预期在 token 请求未过期的情况下被多次使用?

感谢您阅读本文。

我问 AWS 支持 DynamoDB 上类似的问题,说,我必须使用 AWSCredentials 而不是 AWSCredentialsProvider。虽然这不是关于 SNSClient 的答案,但我认为它可能有效。

最佳答案

通过使用“new DefaultAWSCredentialsProviderChain().getCredentials()”,您可以在那个时间点拍摄 AWS 凭证的快照并将它们提供给 SNS 客户端。如果您发现在某个时间点后收到 ExpiredToken 错误,很可能是因为您依赖于 EC2 角色提供的轮换凭证。

不要将 AWSCredentials 传递到 SNS 客户端,而是尝试传递 DefaultAWSCredentialsProviderChain 的实例。这应该会在凭据过期时自动刷新凭据。

异步客户端也会遇到同样的问题。

关于java - AWS 的 AsyncClients in Java 线程安全且持久吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26772257/

相关文章:

java - 如何复制正在运行的应用程序的 RAM,保存它,然后将其重新加载到 RAM 中?

Java WebService线程创建

json - Cloudformation 找不到区域 Opsworks 堆栈

amazon-web-services - 如何为 lambda/dynamo 创建 cloudformation cloudwatch 警报?

python - 如何通过 Boto3 将文件上传到 S3 中的特定文件夹

java - 如何指定jdbc/DataSource?

java - drawRect() 在某些颜色上无法正常工作

java - 如何在 PHP 中仅初始化服务器一次

c# - 嵌入Python,用线程代码结束子解释器

multithreading - 我什么时候应该使用临界区?