AWS的AsyncClients是否是Java线程安全且持久的?

时间:2014-11-06 05:21:31

标签: 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期望在没有令牌请求到期的情况下多次使用?

感谢您阅读本文。

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

1 个答案:

答案 0 :(得分:3)

通过使用"新的DefaultAWSCredentialsProviderChain()。getCredentials()",您可以在该时间点获取AWS凭据的快照并将其提供给SNS客户端。如果您发现在某个时间点之后您收到了ExpiredToken错误,那么您很可能依赖于EC2角色提供的轮换凭据。

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

您与异步客户端存在同样的问题。