我打算向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
期望在没有令牌请求到期的情况下多次使用?
感谢您阅读本文。
我问AWS支持DynamoDB上的类似问题,我说,我必须使用AWSCredentials而不是AWSCredentialsProvider。虽然它不是SNSClient的答案,但我认为它可能有用。
答案 0 :(得分:3)
通过使用"新的DefaultAWSCredentialsProviderChain()。getCredentials()",您可以在该时间点获取AWS凭据的快照并将其提供给SNS客户端。如果您发现在某个时间点之后您收到了ExpiredToken错误,那么您很可能依赖于EC2角色提供的轮换凭据。
不要将AWSCredentials传递到SNS客户端,而是尝试传入DefaultAWSCredentialsProviderChain的实例。这应该在凭据到期时自动刷新凭据。
您与异步客户端存在同样的问题。