我打算向 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/