我打算将消息发送到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的实例。这应注意在凭据过期时自动刷新凭据。
异步客户端也会遇到相同的问题。