

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 完成重新分片操作
<a name="kinesis-using-sdk-java-after-resharding"></a>

在 Amazon Kinesis Data Streams 中执行任何类型的重新分片过程之后，在继续常规记录处理之前，需要执行其他流程并注意一些事项。以下各节介绍了这些过程。

**Topics**
+ [等待流再次变为活动状态](#kinesis-using-sdk-java-resharding-wait-until-active)
+ [重新分片之后考虑数据路由、数据保留和分片状态](#kinesis-using-sdk-java-resharding-data-routing)

## 等待流再次变为活动状态
<a name="kinesis-using-sdk-java-resharding-wait-until-active"></a>

在调用重新分片操作 `splitShard` 或 `mergeShards` 之后，您必须等待流再次变为活动状态。要使用的代码与您在[创建流](kinesis-using-sdk-java-create-stream.md)之后等待流变为活动状态时使用的代码相同。代码如下所示：

```
DescribeStreamRequest describeStreamRequest = new DescribeStreamRequest();
describeStreamRequest.setStreamName( myStreamName );

long startTime = System.currentTimeMillis();
long endTime = startTime + ( 10 * 60 * 1000 );
while ( System.currentTimeMillis() < endTime ) 
{
  try {
    Thread.sleep(20 * 1000);
  } 
  catch ( Exception e ) {}
  
  try {
    DescribeStreamResult describeStreamResponse = client.describeStream( describeStreamRequest );
    String streamStatus = describeStreamResponse.getStreamDescription().getStreamStatus();
    if ( streamStatus.equals( "ACTIVE" ) ) {
      break;
    }
   //
    // sleep for one second
    //
    try {
      Thread.sleep( 1000 );
    }
    catch ( Exception e ) {}
  }
  catch ( ResourceNotFoundException e ) {}
}
if ( System.currentTimeMillis() >= endTime ) 
{
  throw new RuntimeException( "Stream " + myStreamName + " never went active" );
}
```

## 重新分片之后考虑数据路由、数据保留和分片状态
<a name="kinesis-using-sdk-java-resharding-data-routing"></a>

Kinesis Data Streams 是一项实时数据流服务。您的应用程序应假定数据不断地在流中的分片内流动。当您重新分片时，流至父分片的数据记录将基于数据记录分区键映射到的哈希键值重新路由至子分片。但是，重新分片前位于父分片中的任何数据记录将仍位于这些父分片中。父分片在重新分片发生后不会消失。它们与重新分片之前包含的数据一起保留。可以使用 Kinesis Data Streams API 中的 [`getShardIterator` 和 `getRecords`](developing-consumers-with-sdk.md#kinesis-using-sdk-java-get-data) 操作或通过 Kinesis Client Library 访问父分片中的数据记录。

**注意**  
数据记录在当前保留期内添加到流中后即可访问。不论在该期间内对流中的分片进行了任何更改，都是如此。有关流的保留期的更多信息，请参阅[更改数据留存期](kinesis-extended-retention.md)。

在重新分片过程中，父分片将从 `OPEN` 状态过渡到 `CLOSED` 状态再过渡到 `EXPIRED` 状态。
+  **OPEN**：在重新分片操作之前，父分片处于 `OPEN` 状态，这意味着数据记录可添加到分片中并且可从分片进行检索。
+  **CLOSED**：在重新分片操作之后，父分片将过渡到 `CLOSED` 状态。这意味着无法再向此分片添加数据记录。原本应该已添加到此分片的数据记录现在将改为添加到子分片。但是，数据记录在有限时间内仍可从此分片进行检索。
+  **EXPIRED**：在流的保留期过期之后，父分片中的所有数据记录将会过期，不再可供访问。此时，父分片自身将过渡到 `EXPIRED` 状态。用于枚举流中的分片的 `getStreamDescription().getShards` 调用不包括返回的分片列表中的 `EXPIRED` 分片。有关流的保留期的更多信息，请参阅[更改数据留存期](kinesis-extended-retention.md)。

在进行重新分片并且流再次处于 `ACTIVE` 状态之后，您可立即开始读取子分片中的数据。但是，在重新分片后保留的父分片可能仍包含您尚未读取并且已在重新分片前添加到流中的数据。如果您在读取完父分片中的所有数据之前读取子分片中的数据，则可不按数据记录的序列号指定的顺序读取特定哈希键的数据。因此，假定数据顺序很重要，您在重新分片后应始终继续读取父分片中的数据直到读取完。并且只有在这之后才应开始读取子分片中的数据。如果 `getRecordsResult.getNextShardIterator` 返回 `null`，则这指示您已读取完父分片中的所有数据。