

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Desenvolva consumidores com produtividade compartilhada com o AWS SDK para Java
<a name="developing-consumers-with-sdk"></a>

Um dos métodos para desenvolver consumidores personalizados do Kinesis Data Streams com compartilhamento total é usar o Amazon APIs Kinesis Data Streams com o. AWS SDK para Java Esta seção descreve o uso do Kinesis APIs Data Streams AWS SDK para Java com o. Você pode chamar o Kinesis APIs Data Streams usando outras linguagens de programação diferentes. Para obter mais informações sobre todas as opções disponíveis AWS SDKs, consulte [Comece a desenvolver com a Amazon Web Services](https://aws.amazon.com/developers/getting-started/). 

O código de exemplo Java nesta seção demonstra como executar operações básicas da API do Kinesis Data Streams e está dividido logicamente por tipo de operação. Esses exemplos não representam um código pronto para produção. Eles não verificam todas as exceções possíveis nem levam em conta todas as considerações de segurança ou desempenho possíveis. 

**Topics**
+ [Como obter dados de um fluxo](#kinesis-using-sdk-java-get-data)
+ [Como usar iteradores de fragmentos](#kinesis-using-sdk-java-get-data-shard-iterators)
+ [Use GetRecords](#kinesis-using-sdk-java-get-data-getrecords)
+ [Adaptar para uma nova fragmentação](#kinesis-using-sdk-java-get-data-reshard)

## Como obter dados de um fluxo
<a name="kinesis-using-sdk-java-get-data"></a>

Os Kinesis APIs Data Streams `getShardIterator` incluem `getRecords` os métodos e que você pode invocar para recuperar registros de um stream de dados. Esse é o modelo de pull, em que o código extrai registros de dados diretamente dos fragmentos do fluxo de dados.

**Importante**  
Recomenda-se usar o suporte do processador de registros fornecido pela KCL para recuperar registros dos fluxos de dados. Esse é o modelo push, no qual é implementado o código que processa os dados. A KCL recupera registros de dados do fluxo de dados e os entrega ao código da aplicação. Além disso, a KCL fornece as funcionalidades de failover, recuperação e balanceamento de carga. Para obter mais informações, consulte [Desenvolver consumidores personalizados com throughput compartilhada usando a KCL](https://docs.aws.amazon.com/streams/latest/dev/shared-throughput-kcl-consumers.html).

No entanto, em alguns casos, talvez você prefira usar o Kinesis APIs Data Streams. Um exemplo disso é a implementação de ferramentas personalizadas de monitoramento ou depuração dos fluxos de dados.

**Importante**  
O Kinesis Data Streams oferece suporte a alterações do período de retenção do registro de dados no fluxo de dados. Para obter mais informações, consulte [Alterar o período de retenção de dados](kinesis-extended-retention.md).

## Como usar iteradores de fragmentos
<a name="kinesis-using-sdk-java-get-data-shard-iterators"></a>

Os registros do fluxo são recuperados por fragmentos. Para cada fragmento e para cada lote de registros que recupera desse fragmento, é necessário obter um *iterador de fragmentos*. O iterador de fragmentos é usado no objeto `getRecordsRequest` para especificar o fragmento a partir do qual os registros devem ser recuperados. O tipo associado ao iterador de fragmentos determina o ponto no fragmento a partir do qual os registros devem ser recuperados (veja mais à frente nesta seção para obter mais detalhes). Para trabalhar com o iterador de fragmentos, é necessário recuperar o fragmento. Para obter mais informações, consulte [Listar fragmentos](kinesis-using-sdk-java-list-shards.md).

Obtenha o iterador de fragmentos inicial usando o método `getShardIterator`. Obtenha iteradores de fragmentos para obter mais lotes de registros usando o método `getNextShardIterator` do objeto`getRecordsResult` retornado pelo método `getRecords`. Um iterador de fragmentos é válido por 5 minutos. Se um iterador de fragmentos for usado durante sua validade, um novo será fornecido. Cada iterador de fragmentos permanecerá válido por 5 minutos, mesmo depois de ser usado.

Para obter o iterador de fragmentos inicial, instancie `GetShardIteratorRequest` e passe-o ao método `getShardIterator`. Para configurar a solicitação, especifique o fluxo e o ID do fragmento. Para obter informações sobre como obter os streams em sua AWS conta, consulte[Listar fluxos](kinesis-using-sdk-java-list-streams.md). Para obter informações sobre como obter os fragmentos em um fluxo, consulte [Listar fragmentos](kinesis-using-sdk-java-list-shards.md).

```
String shardIterator;
GetShardIteratorRequest getShardIteratorRequest = new GetShardIteratorRequest();
getShardIteratorRequest.setStreamName(myStreamName);
getShardIteratorRequest.setShardId(shard.getShardId());
getShardIteratorRequest.setShardIteratorType("TRIM_HORIZON");

GetShardIteratorResult getShardIteratorResult = client.getShardIterator(getShardIteratorRequest);
shardIterator = getShardIteratorResult.getShardIterator();
```

Esse código de exemplo especifica `TRIM_HORIZON` como o tipo de iterador ao obter o iterador de fragmentos inicial. Esse tipo de iterador significa que o retorno dos registros deve começar a partir do primeiro registro adicionado ao fragmento, em vez de começar pelo registro adicionado mais recentemente, também conhecido como *extremidade*. Estes são tipos de iterador possíveis:
+ `AT_SEQUENCE_NUMBER`
+ `AFTER_SEQUENCE_NUMBER`
+ `AT_TIMESTAMP`
+ `TRIM_HORIZON`
+ `LATEST`

Para obter mais informações, consulte [ShardIteratorType](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_GetShardIterator.html#Kinesis-GetShardIterator-request-ShardIteratorType).

Alguns tipos de iterador exigem que um número de sequência seja especificado, além do tipo. Por exemplo:

```
getShardIteratorRequest.setShardIteratorType("AT_SEQUENCE_NUMBER");
getShardIteratorRequest.setStartingSequenceNumber(specialSequenceNumber);
```

Depois de obter um registro usando `getRecords`, pode-se conseguir o número de sequência do registro chamando o método `getSequenceNumber` do registro. 

```
record.getSequenceNumber()
```

Além disso, o código que adiciona registros ao fluxo de dados pode obter o número de sequência de um registro adicional chamando `getSequenceNumber` no resultado de `putRecord`. 

```
lastSequenceNumber = putRecordResult.getSequenceNumber();
```

É possível usar números sequenciais para garantir estritamente o ordenamento crescente do registros. Para obter mais informações, consulte o exemplo de código em [PutRecord exemplo](developing-producers-with-sdk.md#kinesis-using-sdk-java-putrecord-example).

## Use GetRecords
<a name="kinesis-using-sdk-java-get-data-getrecords"></a>

Após obter o iterador de fragmentos, instancie um objeto `GetRecordsRequest`. Especifique o iterador para a solicitação usando o método `setShardIterator`. 

Opcionalmente, também é possível definir o número de registros a recuperar usando o método `setLimit`. O número de registros retornados por `getRecords` sempre é igual ou menor que esse limite. Se esse limite não for especificado, `getRecords` retornará 10 MB de registros recuperados. O código de exemplo a seguir define esse limite para 25 registros.

Se nenhum registro for retornado, isso significa que não há registros de dados disponíveis atualmente nesse fragmento no número de sequência referenciado pelo iterador de fragmentos. Nessa situação, a aplicação deve aguardar o tempo adequado de acordo com as fontes de dados do fluxo. Em seguida, tente obter os dados do fragmento novamente usando o iterador de fragmentos retornado pela chamada anterior a `getRecords`. 

Passe o `getRecordsRequest` para o método `getRecords` e capture o valor retornado como um objeto `getRecordsResult`. Para obter os registros de dados, chame o método `getRecords` no objeto `getRecordsResult`. 

```
GetRecordsRequest getRecordsRequest = new GetRecordsRequest();
getRecordsRequest.setShardIterator(shardIterator);
getRecordsRequest.setLimit(25);

GetRecordsResult getRecordsResult = client.getRecords(getRecordsRequest);
List<Record> records = getRecordsResult.getRecords();
```

Para preparar-se para outra chamada para `getRecords`, obtenha o próximo iterador de fragmentos de `getRecordsResult`. 

```
shardIterator = getRecordsResult.getNextShardIterator();
```

Para obter os melhores resultados, aguarde pelo menos 1 segundo (1.000 milissegundos) entre as chamadas para `getRecords` a fim de evitar exceder o limite na frequência de `getRecords`. 

```
try {
  Thread.sleep(1000);
}
catch (InterruptedException e) {}
```

Normalmente, deve-se chamar `getRecords` em um loop, mesmo se estiver recuperando um único registro em um cenário de teste. Uma única chamada para `getRecords` pode retornar uma lista de registros vazia, mesmo quando o fragmento contém mais registros em números de sequência subsequentes. Quando isso ocorre, o `NextShardIterator` retornado com a lista de registros vazia faz referência a um número de sequência subsequente no fragmento, e as chamadas posteriores a `getRecords` acabam retornando os registros. O exemplo a seguir demonstra o uso de um loop.

**Exemplo: getRecords**  
O código de exemplo a seguir reflete as dicas de `getRecords` nesta seção, inclusive chamadas em um loop.

```
// Continuously read data records from a shard
List<Record> records;
    
while (true) {
   
  // Create a new getRecordsRequest with an existing shardIterator 
  // Set the maximum records to return to 25
  
  GetRecordsRequest getRecordsRequest = new GetRecordsRequest();
  getRecordsRequest.setShardIterator(shardIterator);
  getRecordsRequest.setLimit(25); 

  GetRecordsResult result = client.getRecords(getRecordsRequest);
  
  // Put the result into record list. The result can be empty.
  records = result.getRecords();
  
  try {
    Thread.sleep(1000);
  } 
  catch (InterruptedException exception) {
    throw new RuntimeException(exception);
  }
  
  shardIterator = result.getNextShardIterator();
}
```

Se a Kinesis Client Library estiver sendo usada, ela poderá fazer várias chamadas antes de retornar dados. Esse comportamento é projetado e não indica um problema com a KCL ou com seus dados.

## Adaptar para uma nova fragmentação
<a name="kinesis-using-sdk-java-get-data-reshard"></a>

 `getRecordsResult.getNextShardIterator` retorna `null` para indicar que o fragmento passou por uma divisão ou uma mesclagem. O fragmento agora está em estado de `CLOSED`, e todos os registros de dados disponíveis nele foram lidos. 

 Nesse cenário, pode-se usar `getRecordsResult.childShards` para conhecer os fragmentos filho que foram criados pela divisão ou mesclagem do fragmento sendo processado. Para obter mais informações, consulte [ChildShard](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_ChildShard.html).

 No caso de uma divisão, os dois novos fragmentos têm `parentShardId` igual ao ID do fragmento que estavam sendo processados anteriormente. O valor de `adjacentParentShardId` dos dois fragmentos é `null`. 

 No caso de uma fusão, o fragmento unificado criado terá `parentShardId` igual ao ID de um dos fragmentos pai e `adjacentParentShardId` igual ao ID do outro fragmento. Seu aplicativo já leu todos os dados de um desses fragmentos. Esse é o fragmento para o qual `getRecordsResult.getNextShardIterator` retornou `null`. Se a ordem dos dados for importante para o aplicativo, deve-se garantir que ele também leia todos os dados de outro fragmento pai antes de ler qualquer dado novo de fragmento filho criado pela fusão. 

 Se vários processadores forem usados para recuperar dados do fluxo (digamos, um processador por fragmento) e ocorrer uma divisão ou fusão de fragmentos, deve-se aumentar ou diminuir o número de processadores para se adaptar à alteração no número de fragmentos. 

 Para obter mais informações sobre a refragmentação, incluindo uma discussão sobre estados de fragmentos (como `CLOSED`), consulte [Refragmentar um fluxo](kinesis-using-sdk-java-resharding.md). 