public GetShardIteratorResult unmarshall(JsonUnmarshallerContext context) throws Exception {
    GetShardIteratorResult getShardIteratorResult = new GetShardIteratorResult();

    int originalDepth = context.getCurrentDepth();
    String currentParentElement = context.getCurrentParentElement();
    int targetDepth = originalDepth + 1;

    JsonToken token = context.getCurrentToken();
    if (token == null) token = context.nextToken();
    if (token == VALUE_NULL) return null;

    while (true) {
      if (token == null) break;

      if (token == FIELD_NAME || token == START_OBJECT) {
        if (context.testExpression("ShardIterator", targetDepth)) {
          context.nextToken();
          getShardIteratorResult.setShardIterator(
              StringJsonUnmarshaller.getInstance().unmarshall(context));
        }
      } else if (token == END_ARRAY || token == END_OBJECT) {
        if (context.getLastParsedParentElement() == null
            || context.getLastParsedParentElement().equals(currentParentElement)) {
          if (context.getCurrentDepth() <= originalDepth) break;
        }
      }

      token = context.nextToken();
    }

    return getShardIteratorResult;
  }
예제 #2
0
  private String getShardItertor() {
    // either return a cached one or get a new one via a GetShardIterator request.
    if (currentShardIterator == null) {
      String shardId;

      // If ShardId supplied use it, else choose first one
      if (!getEndpoint().getShardId().isEmpty()) {
        shardId = getEndpoint().getShardId();
      } else {
        DescribeStreamRequest req1 =
            new DescribeStreamRequest().withStreamName(getEndpoint().getStreamName());
        DescribeStreamResult res1 = getClient().describeStream(req1);
        shardId = res1.getStreamDescription().getShards().get(0).getShardId();
      }
      LOG.debug("ShardId is: {}", shardId);

      GetShardIteratorRequest req =
          new GetShardIteratorRequest()
              .withStreamName(getEndpoint().getStreamName())
              .withShardId(shardId)
              .withShardIteratorType(getEndpoint().getIteratorType());

      if (hasSequenceNumber()) {
        req.withStartingSequenceNumber(getEndpoint().getSequenceNumber());
      }

      GetShardIteratorResult result = getClient().getShardIterator(req);
      currentShardIterator = result.getShardIterator();
    }
    LOG.debug("Shard Iterator is: {}", currentShardIterator);
    return currentShardIterator;
  }
예제 #3
0
  /**
   * Get the records from the particular shard
   *
   * @param streamName Name of the stream from where the records to be accessed
   * @param recordsLimit Number of records to return from shard
   * @param shId Shard Id of the shard
   * @param iteratorType Shard iterator type
   * @param seqNo Record sequence number
   * @return the list of records from the given shard
   * @throws AmazonClientException
   */
  public List<Record> getRecords(
      String streamName,
      Integer recordsLimit,
      String shId,
      ShardIteratorType iteratorType,
      String seqNo)
      throws AmazonClientException {
    assert client != null : "Illegal client";
    try {
      // Create the GetShardIteratorRequest instance and sets streamName, shardId and iteratorType
      // to it
      GetShardIteratorRequest iteratorRequest = new GetShardIteratorRequest();
      iteratorRequest.setStreamName(streamName);
      iteratorRequest.setShardId(shId);
      iteratorRequest.setShardIteratorType(iteratorType);

      // If the iteratorType is AFTER_SEQUENCE_NUMBER, set the sequence No to the iteratorRequest
      if (ShardIteratorType.AFTER_SEQUENCE_NUMBER.equals(iteratorType)
          || ShardIteratorType.AT_SEQUENCE_NUMBER.equals(iteratorType))
        iteratorRequest.setStartingSequenceNumber(seqNo);

      // Get the Response from the getShardIterator service method & get the shardIterator from that
      // response
      GetShardIteratorResult iteratorResponse = client.getShardIterator(iteratorRequest);
      // getShardIterator() specifies the position in the shard
      String iterator = iteratorResponse.getShardIterator();

      // Create the GetRecordsRequest instance and set the recordsLimit and iterator
      GetRecordsRequest getRequest = new GetRecordsRequest();
      getRequest.setLimit(recordsLimit);
      getRequest.setShardIterator(iterator);

      // Get the Response from the getRecords service method and get the data records from that
      // response.
      GetRecordsResult getResponse = client.getRecords(getRequest);
      return getResponse.getRecords();
    } catch (AmazonClientException e) {
      throw new RuntimeException(e);
    }
  }