我编写了一个源自 Kinesis 主题的Java服务。只要数据不太常见,服务就会启动/运行良好并且消耗愉快。如果存在>的间隙它停止消耗60-90分钟。没有发出错误,但后续数据在Kinesis中排队并一直停留,直到服务重新启动。
在这些安静的时期,Kinesis是否有某种需要发送的心跳或保持信息?
我查看了配置( KinesisClientLibConfiguration )并没有看到任何明显的结果。希望这不会导致每小时循环连接。
KinesisClientLibConfiguration kinesisClientLibConfiguration =
new KinesisClientLibConfiguration(config.getString("appname"),
config.getString("kinesis/stream_name"),
kinesisCredentialsProvider, localProvider,
localProvider, workerId);
kinesisClientLibConfiguration.withInitialPositionInStream(
InitialPositionInStream.TRIM_HORIZON);
我设法找到一些错误输出 - 很多这些:
com.amazonaws.services.kinesis.clientlibrary.lib.worker.ProcessTask call 严重:ShardId shardId-000000000000:捕获异常: com.amazonaws.services.kinesis.model.AmazonKinesisException:请求中包含的安全令牌已过期(服务:AmazonKinesis;状态代码:400;错误代码:ExpiredTokenException;请求ID:cdb95cb6-23bb-0067-9c7b-1ad1125d7b7e)< / p>
这些消息在应用程序启动后60分钟开始。发现this提及在到期前5分钟刷新&#39;。鉴于我在此调用中有两种凭据(一种用于kinesis,另一种用于dynamodb / cloud watch),我将尝试使用.refresh()
的计时器。
答案 0 :(得分:0)
(这里有效)
注意:这涉及两个凭据来源 - 本地和远程。本地用于 DynamoDB 和 CloudWatch 。遥控器用于 Kinesis 。
AWSCredentialsProvider localProvider = new ClasspathPropertiesFileCredentialsProvider("credentials");
STSAssumeRoleSessionCredentialsProvider stsRoleCredentials = new STSAssumeRoleSessionCredentialsProvider.Builder(
config.getString("kinesis/arn"), config.getString("kinesis/role_session_name"))
.withExternalId(config.getString("kinesis/external_id")).build();
KinesisClientLibConfiguration kinesisClientLibConfiguration = new KinesisClientLibConfiguration(
config.getString("appname"),
config.getString("kinesis/stream_name"),
stsRoleCredentials, localProvider, localProvider, workerId);
如果您使用 CredentialsProvider ,它将为您执行令牌刷新。经过一番探索后,我发现我正在进行的.refresh()
调用是为了清空函数。