Kinesis Java使用者 - keepalive / heartbeat?

时间:2017-06-19 21:13:52

标签: java amazon-kinesis

我编写了一个源自 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()的计时器。

1 个答案:

答案 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()调用是为了清空函数。