我编写了一个服务,它使用的是一个主题。只要数据不太频繁,服务就会很好地启动/运行,并愉快地使用。如果有超过60-90分钟的间隙,它就停止消耗.没有发出错误,但随后的数据队列在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调用严厉: ShardId shardId-000000000000:捕获异常: com.amazonaws.services.kinesis.model.AmazonKinesisException:请求中包含的安全令牌过期(服务: AmazonKinesis;状态代码: 400;错误代码: ExpiredTokenException;请求ID: cdb95cb6-23bb-0067-9c7b-1ad1125d7b7e)
这些信息在应用程序启动后60分钟就开始了。找到这引用,上面写着“过期前5分钟刷新”。考虑到在这个调用中我有两种凭证(一种用于动态访问,另一种用于dynamodb/cloud ),我将尝试使用.refresh()
计时器。
发布于 2017-06-20 21:20:34
(以下是起作用的原因)
注意:这涉及两个凭据源-一个本地和一个远程。本地的是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()
调用是空函数的。
https://stackoverflow.com/questions/44640051
复制相似问题