Amazon web services 从dynamodb流读取数据

Amazon web services 从dynamodb流读取数据,amazon-web-services,amazon-dynamodb,Amazon Web Services,Amazon Dynamodb,我已经为我的dynamo表设置了流。我遵循文档中的示例程序从streams()读取数据。但是我有一个问题- 在迭代碎片时,检查碎片编辑器是否为null似乎不是退出循环的充分条件。我的代码进入无限循环。在示例程序中,计算更改的数量,用于退出循环--> while(nextir!=null&&numChanges>0){ //使用迭代器从碎片读取数据记录 GetRecordsResult GetRecordsResult= streamsClient.getRecords(新的GetRecordsR

我已经为我的dynamo表设置了流。我遵循文档中的示例程序从streams()读取数据。但是我有一个问题- 在迭代碎片时,检查碎片编辑器是否为null似乎不是退出循环的充分条件。我的代码进入无限循环。在示例程序中,计算更改的数量,用于退出循环-->

while(nextir!=null&&numChanges>0){
//使用迭代器从碎片读取数据记录
GetRecordsResult GetRecordsResult=
streamsClient.getRecords(新的GetRecordsRequest()。
使用硬迭代器(nextir));
列表记录=getRecordsResult.getRecords();
System.out.println(“获取记录…”);
用于(记录:记录){
系统输出打印项次(记录);
numChanges--;
}
nextItr=getRecordsResult.getNextSharedIterator();
}

但在现实环境中,我确信维护变更列表是不现实的。设计是一个无限循环吗?为什么shardIterator没有变为null?

我重复我对您在这里发布的同一个问题的回答:

只要碎片处于打开状态并且正在积极接收未来可能的更新,nextIterator就不会变为null。一旦碎片关闭并且最后一条记录被遍历,那么您的循环可能会退出,并在那里指示不再可能从碎片中获取更多记录

请参阅我们的文档:

如果设置为null,则碎片已关闭,请求的迭代器将不再返回任何数据


希望有帮助,感谢您对DynamoDB的兴趣

谢谢。但是,在读取流时退出此循环的最佳方法是什么?我求助于检查记录数是否为0,然后退出循环。但我想知道流之间是否有空碎片。即使在收到getRecords结果0之后,也肯定有可能有更多记录。如果活动流仍然打开以供写入,如何确保没有更多记录进入活动流?确保的唯一方法是禁用流,这样就可以确定不会有更多的记录进入,然后遍历这些记录,直到nextIterator为null。否则,开放流的要点是,您应该始终轮询更多记录,因为只要流是开放的,记录可能会再次显示。那么,有没有办法关闭碎片X,创建新的碎片Y(以便在DynamoDB中存储新的可能更改),并从碎片X读取所有更改,直到某个时间段?
while (nextItr != null && numChanges > 0) {

   // Use the iterator to read the data records from the shard

  GetRecordsResult getRecordsResult = 
          streamsClient.getRecords(new GetRecordsRequest().
          withShardIterator(nextItr));
   List<Record> records = getRecordsResult.getRecords();
   System.out.println("Getting records...");
   for (Record record : records) {
           System.out.println(record);
            numChanges--;
    }
    nextItr = getRecordsResult.getNextShardIterator();
}