com.amazonaws.services.kinesis.AmazonKinesisClient Maven / Gradle / Ivy
/*
* Copyright 2011-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License"). You may not
* use this file except in compliance with the License. A copy of the License is
* located at
*
* http://aws.amazon.com/apache2.0
*
* or in the "license" file accompanying this file. This file is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
package com.amazonaws.services.kinesis;
import org.w3c.dom.*;
import java.net.*;
import java.util.*;
import java.util.Map.Entry;
import org.apache.commons.logging.*;
import com.amazonaws.*;
import com.amazonaws.auth.*;
import com.amazonaws.handlers.*;
import com.amazonaws.http.*;
import com.amazonaws.internal.*;
import com.amazonaws.internal.auth.*;
import com.amazonaws.metrics.*;
import com.amazonaws.regions.*;
import com.amazonaws.transform.*;
import com.amazonaws.util.*;
import com.amazonaws.protocol.json.*;
import com.amazonaws.util.AWSRequestMetrics.Field;
import com.amazonaws.annotation.ThreadSafe;
import com.amazonaws.client.AwsSyncClientParams;
import com.amazonaws.services.kinesis.waiters.AmazonKinesisWaiters;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.services.kinesis.model.*;
import com.amazonaws.services.kinesis.model.transform.*;
/**
* Client for accessing Kinesis. All service calls made using this client are
* blocking, and will not return until the service call completes.
*
* Amazon Kinesis Streams Service API Reference
*
* Amazon Kinesis Streams is a managed service that scales elastically for real
* time processing of streaming big data.
*
*/
@ThreadSafe
public class AmazonKinesisClient extends AmazonWebServiceClient implements
AmazonKinesis {
/** Provider for AWS credentials. */
private final AWSCredentialsProvider awsCredentialsProvider;
private static final Log log = LogFactory.getLog(AmazonKinesis.class);
/** Default signing name for the service. */
private static final String DEFAULT_SIGNING_NAME = "kinesis";
private volatile AmazonKinesisWaiters waiters;
/**
* Client configuration factory providing ClientConfigurations tailored to
* this client
*/
protected static final ClientConfigurationFactory configFactory = new ClientConfigurationFactory();
private final SdkJsonProtocolFactory protocolFactory = new SdkJsonProtocolFactory(
new JsonClientMetadata()
.withProtocolVersion("1.1")
.withSupportsCbor(true)
.addErrorMetadata(
new JsonErrorShapeMetadata()
.withErrorCode("InvalidArgumentException")
.withModeledClass(
com.amazonaws.services.kinesis.model.InvalidArgumentException.class))
.addErrorMetadata(
new JsonErrorShapeMetadata()
.withErrorCode("ResourceInUseException")
.withModeledClass(
com.amazonaws.services.kinesis.model.ResourceInUseException.class))
.addErrorMetadata(
new JsonErrorShapeMetadata()
.withErrorCode("ResourceNotFoundException")
.withModeledClass(
com.amazonaws.services.kinesis.model.ResourceNotFoundException.class))
.addErrorMetadata(
new JsonErrorShapeMetadata()
.withErrorCode("ExpiredIteratorException")
.withModeledClass(
com.amazonaws.services.kinesis.model.ExpiredIteratorException.class))
.addErrorMetadata(
new JsonErrorShapeMetadata()
.withErrorCode(
"ProvisionedThroughputExceededException")
.withModeledClass(
com.amazonaws.services.kinesis.model.ProvisionedThroughputExceededException.class))
.addErrorMetadata(
new JsonErrorShapeMetadata()
.withErrorCode("LimitExceededException")
.withModeledClass(
com.amazonaws.services.kinesis.model.LimitExceededException.class))
.withBaseServiceExceptionClass(
com.amazonaws.services.kinesis.model.AmazonKinesisException.class));
/**
* Constructs a new client to invoke service methods on Kinesis. A
* credentials provider chain will be used that searches for credentials in
* this order:
*
* - Environment Variables - AWS_ACCESS_KEY_ID and AWS_SECRET_KEY
* - Java System Properties - aws.accessKeyId and aws.secretKey
* - Instance profile credentials delivered through the Amazon EC2
* metadata service
*
*
*
* All service calls made using this new client object are blocking, and
* will not return until the service call completes.
*
* @see DefaultAWSCredentialsProviderChain
*/
public AmazonKinesisClient() {
this(new DefaultAWSCredentialsProviderChain(), configFactory
.getConfig());
}
/**
* Constructs a new client to invoke service methods on Kinesis. A
* credentials provider chain will be used that searches for credentials in
* this order:
*
* - Environment Variables - AWS_ACCESS_KEY_ID and AWS_SECRET_KEY
* - Java System Properties - aws.accessKeyId and aws.secretKey
* - Instance profile credentials delivered through the Amazon EC2
* metadata service
*
*
*
* All service calls made using this new client object are blocking, and
* will not return until the service call completes.
*
* @param clientConfiguration
* The client configuration options controlling how this client
* connects to Kinesis (ex: proxy settings, retry counts, etc.).
*
* @see DefaultAWSCredentialsProviderChain
*/
public AmazonKinesisClient(ClientConfiguration clientConfiguration) {
this(new DefaultAWSCredentialsProviderChain(), clientConfiguration);
}
/**
* Constructs a new client to invoke service methods on Kinesis using the
* specified AWS account credentials.
*
*
* All service calls made using this new client object are blocking, and
* will not return until the service call completes.
*
* @param awsCredentials
* The AWS credentials (access key ID and secret key) to use when
* authenticating with AWS services.
*/
public AmazonKinesisClient(AWSCredentials awsCredentials) {
this(awsCredentials, configFactory.getConfig());
}
/**
* Constructs a new client to invoke service methods on Kinesis using the
* specified AWS account credentials and client configuration options.
*
*
* All service calls made using this new client object are blocking, and
* will not return until the service call completes.
*
* @param awsCredentials
* The AWS credentials (access key ID and secret key) to use when
* authenticating with AWS services.
* @param clientConfiguration
* The client configuration options controlling how this client
* connects to Kinesis (ex: proxy settings, retry counts, etc.).
*/
public AmazonKinesisClient(AWSCredentials awsCredentials,
ClientConfiguration clientConfiguration) {
super(clientConfiguration);
this.awsCredentialsProvider = new StaticCredentialsProvider(
awsCredentials);
init();
}
/**
* Constructs a new client to invoke service methods on Kinesis using the
* specified AWS account credentials provider.
*
*
* All service calls made using this new client object are blocking, and
* will not return until the service call completes.
*
* @param awsCredentialsProvider
* The AWS credentials provider which will provide credentials to
* authenticate requests with AWS services.
*/
public AmazonKinesisClient(AWSCredentialsProvider awsCredentialsProvider) {
this(awsCredentialsProvider, configFactory.getConfig());
}
/**
* Constructs a new client to invoke service methods on Kinesis using the
* specified AWS account credentials provider and client configuration
* options.
*
*
* All service calls made using this new client object are blocking, and
* will not return until the service call completes.
*
* @param awsCredentialsProvider
* The AWS credentials provider which will provide credentials to
* authenticate requests with AWS services.
* @param clientConfiguration
* The client configuration options controlling how this client
* connects to Kinesis (ex: proxy settings, retry counts, etc.).
*/
public AmazonKinesisClient(AWSCredentialsProvider awsCredentialsProvider,
ClientConfiguration clientConfiguration) {
this(awsCredentialsProvider, clientConfiguration, null);
}
/**
* Constructs a new client to invoke service methods on Kinesis using the
* specified AWS account credentials provider, client configuration options,
* and request metric collector.
*
*
* All service calls made using this new client object are blocking, and
* will not return until the service call completes.
*
* @param awsCredentialsProvider
* The AWS credentials provider which will provide credentials to
* authenticate requests with AWS services.
* @param clientConfiguration
* The client configuration options controlling how this client
* connects to Kinesis (ex: proxy settings, retry counts, etc.).
* @param requestMetricCollector
* optional request metric collector
*/
public AmazonKinesisClient(AWSCredentialsProvider awsCredentialsProvider,
ClientConfiguration clientConfiguration,
RequestMetricCollector requestMetricCollector) {
super(clientConfiguration, requestMetricCollector);
this.awsCredentialsProvider = awsCredentialsProvider;
init();
}
/**
* Constructs a new client to invoke service methods on Kinesis using the
* specified parameters.
*
*
* All service calls made using this new client object are blocking, and
* will not return until the service call completes.
*
* @param clientParams
* Object providing client parameters.
*/
AmazonKinesisClient(AwsSyncClientParams clientParams) {
super(clientParams);
this.awsCredentialsProvider = clientParams.getCredentialsProvider();
init();
}
private void init() {
setServiceNameIntern(DEFAULT_SIGNING_NAME);
setEndpointPrefix(ENDPOINT_PREFIX);
// calling this.setEndPoint(...) will also modify the signer accordingly
setEndpoint("https://kinesis.us-east-1.amazonaws.com");
HandlerChainFactory chainFactory = new HandlerChainFactory();
requestHandler2s
.addAll(chainFactory
.newRequestHandlerChain("/com/amazonaws/services/kinesis/request.handlers"));
requestHandler2s
.addAll(chainFactory
.newRequestHandler2Chain("/com/amazonaws/services/kinesis/request.handler2s"));
}
/**
*
* Adds or updates tags for the specified Amazon Kinesis stream. Each stream
* can have up to 10 tags.
*
*
* If tags have already been assigned to the stream,
* AddTagsToStream
overwrites any existing tags that correspond
* to the specified tag keys.
*
*
* @param addTagsToStreamRequest
* Represents the input for AddTagsToStream
.
* @return Result of the AddTagsToStream operation returned by the service.
* @throws ResourceNotFoundException
* The requested resource could not be found. The stream might not
* be specified correctly, or it might not be in the
* ACTIVE
state if the operation requires it.
* @throws ResourceInUseException
* The resource is not available for this operation. For successful
* operation, the resource needs to be in the ACTIVE
* state.
* @throws InvalidArgumentException
* A specified parameter exceeds its restrictions, is not supported,
* or can't be used. For more information, see the returned message.
* @throws LimitExceededException
* The requested resource exceeds the maximum number allowed, or the
* number of concurrent stream requests exceeds the maximum number
* allowed (5).
* @sample AmazonKinesis.AddTagsToStream
*/
@Override
public AddTagsToStreamResult addTagsToStream(
AddTagsToStreamRequest addTagsToStreamRequest) {
ExecutionContext executionContext = createExecutionContext(addTagsToStreamRequest);
AWSRequestMetrics awsRequestMetrics = executionContext
.getAwsRequestMetrics();
awsRequestMetrics.startEvent(Field.ClientExecuteTime);
Request request = null;
Response response = null;
try {
awsRequestMetrics.startEvent(Field.RequestMarshallTime);
try {
request = new AddTagsToStreamRequestMarshaller(protocolFactory)
.marshall(super
.beforeMarshalling(addTagsToStreamRequest));
// Binds the request metrics to the current request.
request.setAWSRequestMetrics(awsRequestMetrics);
} finally {
awsRequestMetrics.endEvent(Field.RequestMarshallTime);
}
HttpResponseHandler> responseHandler = protocolFactory
.createResponseHandler(new JsonOperationMetadata()
.withPayloadJson(true)
.withHasStreamingSuccessResponse(false),
new AddTagsToStreamResultJsonUnmarshaller());
response = invoke(request, responseHandler, executionContext);
return response.getAwsResponse();
} finally {
endClientExecution(awsRequestMetrics, request, response);
}
}
/**
*
* Creates an Amazon Kinesis stream. A stream captures and transports data
* records that are continuously emitted from different data sources or
* producers. Scale-out within a stream is explicitly supported by
* means of shards, which are uniquely identified groups of data records in
* a stream.
*
*
* You specify and control the number of shards that a stream is composed
* of. Each shard can support reads up to 5 transactions per second, up to a
* maximum data read total of 2 MB per second. Each shard can support writes
* up to 1,000 records per second, up to a maximum data write total of 1 MB
* per second. You can add shards to a stream if the amount of data input
* increases and you can remove shards if the amount of data input
* decreases.
*
*
* The stream name identifies the stream. The name is scoped to the AWS
* account used by the application. It is also scoped by region. That is,
* two streams in two different accounts can have the same name, and two
* streams in the same account, but in two different regions, can have the
* same name.
*
*
* CreateStream
is an asynchronous operation. Upon receiving a
* CreateStream
request, Amazon Kinesis immediately returns and
* sets the stream status to CREATING
. After the stream is
* created, Amazon Kinesis sets the stream status to ACTIVE
.
* You should perform read and write operations only on an
* ACTIVE
stream.
*
*
* You receive a LimitExceededException
when making a
* CreateStream
request if you try to do one of the following:
*
*
* - Have more than five streams in the
CREATING
state at any
* point in time.
* - Create more shards than are authorized for your account.
*
*
* For the default shard limit for an AWS account, see Streams Limits in the Amazon Kinesis Streams Developer Guide.
* If you need to increase this limit, contact AWS Support.
*
*
* You can use DescribeStream
to check the stream status, which
* is returned in StreamStatus
.
*
*
* CreateStream has a limit of 5 transactions per second per account.
*
*
* @param createStreamRequest
* Represents the input for CreateStream
.
* @return Result of the CreateStream operation returned by the service.
* @throws ResourceInUseException
* The resource is not available for this operation. For successful
* operation, the resource needs to be in the ACTIVE
* state.
* @throws LimitExceededException
* The requested resource exceeds the maximum number allowed, or the
* number of concurrent stream requests exceeds the maximum number
* allowed (5).
* @throws InvalidArgumentException
* A specified parameter exceeds its restrictions, is not supported,
* or can't be used. For more information, see the returned message.
* @sample AmazonKinesis.CreateStream
*/
@Override
public CreateStreamResult createStream(
CreateStreamRequest createStreamRequest) {
ExecutionContext executionContext = createExecutionContext(createStreamRequest);
AWSRequestMetrics awsRequestMetrics = executionContext
.getAwsRequestMetrics();
awsRequestMetrics.startEvent(Field.ClientExecuteTime);
Request request = null;
Response response = null;
try {
awsRequestMetrics.startEvent(Field.RequestMarshallTime);
try {
request = new CreateStreamRequestMarshaller(protocolFactory)
.marshall(super.beforeMarshalling(createStreamRequest));
// Binds the request metrics to the current request.
request.setAWSRequestMetrics(awsRequestMetrics);
} finally {
awsRequestMetrics.endEvent(Field.RequestMarshallTime);
}
HttpResponseHandler> responseHandler = protocolFactory
.createResponseHandler(new JsonOperationMetadata()
.withPayloadJson(true)
.withHasStreamingSuccessResponse(false),
new CreateStreamResultJsonUnmarshaller());
response = invoke(request, responseHandler, executionContext);
return response.getAwsResponse();
} finally {
endClientExecution(awsRequestMetrics, request, response);
}
}
@Override
public CreateStreamResult createStream(String streamName, Integer shardCount) {
return createStream(new CreateStreamRequest()
.withStreamName(streamName).withShardCount(shardCount));
}
/**
*
* Decreases the Amazon Kinesis stream's retention period, which is the
* length of time data records are accessible after they are added to the
* stream. The minimum value of a stream's retention period is 24 hours.
*
*
* This operation may result in lost data. For example, if the stream's
* retention period is 48 hours and is decreased to 24 hours, any data
* already in the stream that is older than 24 hours is inaccessible.
*
*
* @param decreaseStreamRetentionPeriodRequest
* Represents the input for DecreaseStreamRetentionPeriod.
* @return Result of the DecreaseStreamRetentionPeriod operation returned by
* the service.
* @throws ResourceInUseException
* The resource is not available for this operation. For successful
* operation, the resource needs to be in the ACTIVE
* state.
* @throws ResourceNotFoundException
* The requested resource could not be found. The stream might not
* be specified correctly, or it might not be in the
* ACTIVE
state if the operation requires it.
* @throws LimitExceededException
* The requested resource exceeds the maximum number allowed, or the
* number of concurrent stream requests exceeds the maximum number
* allowed (5).
* @throws InvalidArgumentException
* A specified parameter exceeds its restrictions, is not supported,
* or can't be used. For more information, see the returned message.
* @sample AmazonKinesis.DecreaseStreamRetentionPeriod
*/
@Override
public DecreaseStreamRetentionPeriodResult decreaseStreamRetentionPeriod(
DecreaseStreamRetentionPeriodRequest decreaseStreamRetentionPeriodRequest) {
ExecutionContext executionContext = createExecutionContext(decreaseStreamRetentionPeriodRequest);
AWSRequestMetrics awsRequestMetrics = executionContext
.getAwsRequestMetrics();
awsRequestMetrics.startEvent(Field.ClientExecuteTime);
Request request = null;
Response response = null;
try {
awsRequestMetrics.startEvent(Field.RequestMarshallTime);
try {
request = new DecreaseStreamRetentionPeriodRequestMarshaller(
protocolFactory)
.marshall(super
.beforeMarshalling(decreaseStreamRetentionPeriodRequest));
// Binds the request metrics to the current request.
request.setAWSRequestMetrics(awsRequestMetrics);
} finally {
awsRequestMetrics.endEvent(Field.RequestMarshallTime);
}
HttpResponseHandler> responseHandler = protocolFactory
.createResponseHandler(
new JsonOperationMetadata().withPayloadJson(true)
.withHasStreamingSuccessResponse(false),
new DecreaseStreamRetentionPeriodResultJsonUnmarshaller());
response = invoke(request, responseHandler, executionContext);
return response.getAwsResponse();
} finally {
endClientExecution(awsRequestMetrics, request, response);
}
}
/**
*
* Deletes an Amazon Kinesis stream and all its shards and data. You must
* shut down any applications that are operating on the stream before you
* delete the stream. If an application attempts to operate on a deleted
* stream, it will receive the exception
* ResourceNotFoundException
.
*
*
* If the stream is in the ACTIVE
state, you can delete it.
* After a DeleteStream
request, the specified stream is in the
* DELETING
state until Amazon Kinesis completes the deletion.
*
*
* Note: Amazon Kinesis might continue to accept data read and write
* operations, such as PutRecord, PutRecords, and
* GetRecords, on a stream in the DELETING
state until
* the stream deletion is complete.
*
*
* When you delete a stream, any shards in that stream are also deleted, and
* any tags are dissociated from the stream.
*
*
* You can use the DescribeStream operation to check the state of the
* stream, which is returned in StreamStatus
.
*
*
* DeleteStream has a limit of 5 transactions per second per account.
*
*
* @param deleteStreamRequest
* Represents the input for DeleteStream.
* @return Result of the DeleteStream operation returned by the service.
* @throws ResourceNotFoundException
* The requested resource could not be found. The stream might not
* be specified correctly, or it might not be in the
* ACTIVE
state if the operation requires it.
* @throws LimitExceededException
* The requested resource exceeds the maximum number allowed, or the
* number of concurrent stream requests exceeds the maximum number
* allowed (5).
* @sample AmazonKinesis.DeleteStream
*/
@Override
public DeleteStreamResult deleteStream(
DeleteStreamRequest deleteStreamRequest) {
ExecutionContext executionContext = createExecutionContext(deleteStreamRequest);
AWSRequestMetrics awsRequestMetrics = executionContext
.getAwsRequestMetrics();
awsRequestMetrics.startEvent(Field.ClientExecuteTime);
Request request = null;
Response response = null;
try {
awsRequestMetrics.startEvent(Field.RequestMarshallTime);
try {
request = new DeleteStreamRequestMarshaller(protocolFactory)
.marshall(super.beforeMarshalling(deleteStreamRequest));
// Binds the request metrics to the current request.
request.setAWSRequestMetrics(awsRequestMetrics);
} finally {
awsRequestMetrics.endEvent(Field.RequestMarshallTime);
}
HttpResponseHandler> responseHandler = protocolFactory
.createResponseHandler(new JsonOperationMetadata()
.withPayloadJson(true)
.withHasStreamingSuccessResponse(false),
new DeleteStreamResultJsonUnmarshaller());
response = invoke(request, responseHandler, executionContext);
return response.getAwsResponse();
} finally {
endClientExecution(awsRequestMetrics, request, response);
}
}
@Override
public DeleteStreamResult deleteStream(String streamName) {
return deleteStream(new DeleteStreamRequest()
.withStreamName(streamName));
}
/**
*
* Describes the specified Amazon Kinesis stream.
*
*
* The information about the stream includes its current status, its Amazon
* Resource Name (ARN), and an array of shard objects. For each shard
* object, there is information about the hash key and sequence number
* ranges that the shard spans, and the IDs of any earlier shards that
* played in a role in creating the shard. A sequence number is the
* identifier associated with every record ingested in the stream. The
* sequence number is assigned when a record is put into the stream.
*
*
* You can limit the number of returned shards using the Limit
* parameter. The number of shards in a stream may be too large to return
* from a single call to DescribeStream
. You can detect this by
* using the HasMoreShards
flag in the returned output.
* HasMoreShards
is set to true
when there is more
* data available.
*
*
* DescribeStream
is a paginated operation. If there are more
* shards available, you can request them using the shard ID of the last
* shard returned. Specify this ID in the ExclusiveStartShardId
* parameter in a subsequent request to DescribeStream
.
*
*
* There are no guarantees about the chronological order shards returned in
* DescribeStream
results. If you want to process shards in
* chronological order, use ParentShardId
to track lineage to
* the oldest shard.
*
*
* DescribeStream has a limit of 10 transactions per second per
* account.
*
*
* @param describeStreamRequest
* Represents the input for DescribeStream
.
* @return Result of the DescribeStream operation returned by the service.
* @throws ResourceNotFoundException
* The requested resource could not be found. The stream might not
* be specified correctly, or it might not be in the
* ACTIVE
state if the operation requires it.
* @throws LimitExceededException
* The requested resource exceeds the maximum number allowed, or the
* number of concurrent stream requests exceeds the maximum number
* allowed (5).
* @sample AmazonKinesis.DescribeStream
*/
@Override
public DescribeStreamResult describeStream(
DescribeStreamRequest describeStreamRequest) {
ExecutionContext executionContext = createExecutionContext(describeStreamRequest);
AWSRequestMetrics awsRequestMetrics = executionContext
.getAwsRequestMetrics();
awsRequestMetrics.startEvent(Field.ClientExecuteTime);
Request request = null;
Response response = null;
try {
awsRequestMetrics.startEvent(Field.RequestMarshallTime);
try {
request = new DescribeStreamRequestMarshaller(protocolFactory)
.marshall(super
.beforeMarshalling(describeStreamRequest));
// Binds the request metrics to the current request.
request.setAWSRequestMetrics(awsRequestMetrics);
} finally {
awsRequestMetrics.endEvent(Field.RequestMarshallTime);
}
HttpResponseHandler> responseHandler = protocolFactory
.createResponseHandler(new JsonOperationMetadata()
.withPayloadJson(true)
.withHasStreamingSuccessResponse(false),
new DescribeStreamResultJsonUnmarshaller());
response = invoke(request, responseHandler, executionContext);
return response.getAwsResponse();
} finally {
endClientExecution(awsRequestMetrics, request, response);
}
}
@Override
public DescribeStreamResult describeStream(String streamName) {
return describeStream(new DescribeStreamRequest()
.withStreamName(streamName));
}
@Override
public DescribeStreamResult describeStream(String streamName,
String exclusiveStartShardId) {
return describeStream(new DescribeStreamRequest().withStreamName(
streamName).withExclusiveStartShardId(exclusiveStartShardId));
}
@Override
public DescribeStreamResult describeStream(String streamName,
Integer limit, String exclusiveStartShardId) {
return describeStream(new DescribeStreamRequest()
.withStreamName(streamName).withLimit(limit)
.withExclusiveStartShardId(exclusiveStartShardId));
}
/**
*
* Disables enhanced monitoring.
*
*
* @param disableEnhancedMonitoringRequest
* Represents the input for DisableEnhancedMonitoring.
* @return Result of the DisableEnhancedMonitoring operation returned by the
* service.
* @throws InvalidArgumentException
* A specified parameter exceeds its restrictions, is not supported,
* or can't be used. For more information, see the returned message.
* @throws LimitExceededException
* The requested resource exceeds the maximum number allowed, or the
* number of concurrent stream requests exceeds the maximum number
* allowed (5).
* @throws ResourceInUseException
* The resource is not available for this operation. For successful
* operation, the resource needs to be in the ACTIVE
* state.
* @throws ResourceNotFoundException
* The requested resource could not be found. The stream might not
* be specified correctly, or it might not be in the
* ACTIVE
state if the operation requires it.
* @sample AmazonKinesis.DisableEnhancedMonitoring
*/
@Override
public DisableEnhancedMonitoringResult disableEnhancedMonitoring(
DisableEnhancedMonitoringRequest disableEnhancedMonitoringRequest) {
ExecutionContext executionContext = createExecutionContext(disableEnhancedMonitoringRequest);
AWSRequestMetrics awsRequestMetrics = executionContext
.getAwsRequestMetrics();
awsRequestMetrics.startEvent(Field.ClientExecuteTime);
Request request = null;
Response response = null;
try {
awsRequestMetrics.startEvent(Field.RequestMarshallTime);
try {
request = new DisableEnhancedMonitoringRequestMarshaller(
protocolFactory).marshall(super
.beforeMarshalling(disableEnhancedMonitoringRequest));
// Binds the request metrics to the current request.
request.setAWSRequestMetrics(awsRequestMetrics);
} finally {
awsRequestMetrics.endEvent(Field.RequestMarshallTime);
}
HttpResponseHandler> responseHandler = protocolFactory
.createResponseHandler(
new JsonOperationMetadata().withPayloadJson(true)
.withHasStreamingSuccessResponse(false),
new DisableEnhancedMonitoringResultJsonUnmarshaller());
response = invoke(request, responseHandler, executionContext);
return response.getAwsResponse();
} finally {
endClientExecution(awsRequestMetrics, request, response);
}
}
/**
*
* Enables enhanced Amazon Kinesis stream monitoring for shard-level
* metrics.
*
*
* @param enableEnhancedMonitoringRequest
* Represents the input for EnableEnhancedMonitoring.
* @return Result of the EnableEnhancedMonitoring operation returned by the
* service.
* @throws InvalidArgumentException
* A specified parameter exceeds its restrictions, is not supported,
* or can't be used. For more information, see the returned message.
* @throws LimitExceededException
* The requested resource exceeds the maximum number allowed, or the
* number of concurrent stream requests exceeds the maximum number
* allowed (5).
* @throws ResourceInUseException
* The resource is not available for this operation. For successful
* operation, the resource needs to be in the ACTIVE
* state.
* @throws ResourceNotFoundException
* The requested resource could not be found. The stream might not
* be specified correctly, or it might not be in the
* ACTIVE
state if the operation requires it.
* @sample AmazonKinesis.EnableEnhancedMonitoring
*/
@Override
public EnableEnhancedMonitoringResult enableEnhancedMonitoring(
EnableEnhancedMonitoringRequest enableEnhancedMonitoringRequest) {
ExecutionContext executionContext = createExecutionContext(enableEnhancedMonitoringRequest);
AWSRequestMetrics awsRequestMetrics = executionContext
.getAwsRequestMetrics();
awsRequestMetrics.startEvent(Field.ClientExecuteTime);
Request request = null;
Response response = null;
try {
awsRequestMetrics.startEvent(Field.RequestMarshallTime);
try {
request = new EnableEnhancedMonitoringRequestMarshaller(
protocolFactory).marshall(super
.beforeMarshalling(enableEnhancedMonitoringRequest));
// Binds the request metrics to the current request.
request.setAWSRequestMetrics(awsRequestMetrics);
} finally {
awsRequestMetrics.endEvent(Field.RequestMarshallTime);
}
HttpResponseHandler> responseHandler = protocolFactory
.createResponseHandler(
new JsonOperationMetadata().withPayloadJson(true)
.withHasStreamingSuccessResponse(false),
new EnableEnhancedMonitoringResultJsonUnmarshaller());
response = invoke(request, responseHandler, executionContext);
return response.getAwsResponse();
} finally {
endClientExecution(awsRequestMetrics, request, response);
}
}
/**
*
* Gets data records from an Amazon Kinesis stream's shard.
*
*
* Specify a shard iterator using the ShardIterator
parameter.
* The shard iterator specifies the position in the shard from which you
* want to start reading data records sequentially. If there are no records
* available in the portion of the shard that the iterator points to,
* GetRecords returns an empty list. Note that it might take multiple
* calls to get to a portion of the shard that contains records.
*
*
* You can scale by provisioning multiple shards per stream while
* considering service limits (for more information, see Streams Limits in the Amazon Kinesis Streams Developer
* Guide). Your application should have one thread per shard, each
* reading continuously from its stream. To read from a stream continually,
* call GetRecords in a loop. Use GetShardIterator to get the
* shard iterator to specify in the first GetRecords call.
* GetRecords returns a new shard iterator in
* NextShardIterator
. Specify the shard iterator returned in
* NextShardIterator
in subsequent calls to GetRecords.
* Note that if the shard has been closed, the shard iterator can't return
* more data and GetRecords returns null
in
* NextShardIterator
. You can terminate the loop when the shard
* is closed, or when the shard iterator reaches the record with the
* sequence number or other attribute that marks it as the last record to
* process.
*
*
* Each data record can be up to 1 MB in size, and each shard can read up to
* 2 MB per second. You can ensure that your calls don't exceed the maximum
* supported size or throughput by using the Limit
parameter to
* specify the maximum number of records that GetRecords can return.
* Consider your average record size when determining this limit.
*
*
* The size of the data returned by GetRecords varies depending on
* the utilization of the shard. The maximum size of data that
* GetRecords can return is 10 MB. If a call returns this amount of
* data, subsequent calls made within the next 5 seconds throw
* ProvisionedThroughputExceededException
. If there is
* insufficient provisioned throughput on the shard, subsequent calls made
* within the next 1 second throw
* ProvisionedThroughputExceededException
. Note that
* GetRecords won't return any data when it throws an exception. For
* this reason, we recommend that you wait one second between calls to
* GetRecords; however, it's possible that the application will get
* exceptions for longer than 1 second.
*
*
* To detect whether the application is falling behind in processing, you
* can use the MillisBehindLatest
response attribute. You can
* also monitor the stream using CloudWatch metrics and other mechanisms
* (see Monitoring in the Amazon Kinesis Streams Developer Guide).
*
*
* Each Amazon Kinesis record includes a value,
* ApproximateArrivalTimestamp
, that is set when a stream
* successfully receives and stores a record. This is commonly referred to
* as a server-side timestamp, whereas a client-side timestamp is set when a
* data producer creates or sends the record to a stream (a data producer is
* any data source putting data records into a stream, for example with
* PutRecords). The timestamp has millisecond precision. There are no
* guarantees about the timestamp accuracy, or that the timestamp is always
* increasing. For example, records in a shard or across a stream might have
* timestamps that are out of order.
*
*
* @param getRecordsRequest
* Represents the input for GetRecords.
* @return Result of the GetRecords operation returned by the service.
* @throws ResourceNotFoundException
* The requested resource could not be found. The stream might not
* be specified correctly, or it might not be in the
* ACTIVE
state if the operation requires it.
* @throws InvalidArgumentException
* A specified parameter exceeds its restrictions, is not supported,
* or can't be used. For more information, see the returned message.
* @throws ProvisionedThroughputExceededException
* The request rate for the stream is too high, or the requested
* data is too large for the available throughput. Reduce the
* frequency or size of your requests. For more information, see Streams Limits in the Amazon Kinesis Streams Developer
* Guide, and Error Retries and Exponential Backoff in AWS in the AWS
* General Reference.
* @throws ExpiredIteratorException
* The provided iterator exceeds the maximum age allowed.
* @sample AmazonKinesis.GetRecords
*/
@Override
public GetRecordsResult getRecords(GetRecordsRequest getRecordsRequest) {
ExecutionContext executionContext = createExecutionContext(getRecordsRequest);
AWSRequestMetrics awsRequestMetrics = executionContext
.getAwsRequestMetrics();
awsRequestMetrics.startEvent(Field.ClientExecuteTime);
Request request = null;
Response response = null;
try {
awsRequestMetrics.startEvent(Field.RequestMarshallTime);
try {
request = new GetRecordsRequestMarshaller(protocolFactory)
.marshall(super.beforeMarshalling(getRecordsRequest));
// Binds the request metrics to the current request.
request.setAWSRequestMetrics(awsRequestMetrics);
} finally {
awsRequestMetrics.endEvent(Field.RequestMarshallTime);
}
HttpResponseHandler> responseHandler = protocolFactory
.createResponseHandler(new JsonOperationMetadata()
.withPayloadJson(true)
.withHasStreamingSuccessResponse(false),
new GetRecordsResultJsonUnmarshaller());
response = invoke(request, responseHandler, executionContext);
return response.getAwsResponse();
} finally {
endClientExecution(awsRequestMetrics, request, response);
}
}
/**
*
* Gets an Amazon Kinesis shard iterator. A shard iterator expires five
* minutes after it is returned to the requester.
*
*
* A shard iterator specifies the shard position from which to start reading
* data records sequentially. The position is specified using the sequence
* number of a data record in a shard. A sequence number is the identifier
* associated with every record ingested in the stream, and is assigned when
* a record is put into the stream. Each stream has one or more shards.
*
*
* You must specify the shard iterator type. For example, you can set the
* ShardIteratorType
parameter to read exactly from the
* position denoted by a specific sequence number by using the
* AT_SEQUENCE_NUMBER
shard iterator type, or right after the
* sequence number by using the AFTER_SEQUENCE_NUMBER
shard
* iterator type, using sequence numbers returned by earlier calls to
* PutRecord, PutRecords, GetRecords, or
* DescribeStream. In the request, you can specify the shard iterator
* type AT_TIMESTAMP
to read records from an arbitrary point in
* time, TRIM_HORIZON
to cause ShardIterator
to
* point to the last untrimmed record in the shard in the system (the oldest
* data record in the shard), or LATEST
so that you always read
* the most recent data in the shard.
*
*
* When you read repeatedly from a stream, use a GetShardIterator
* request to get the first shard iterator for use in your first
* GetRecords request and for subsequent reads use the shard iterator
* returned by the GetRecords request in
* NextShardIterator
. A new shard iterator is returned by every
* GetRecords request in NextShardIterator
, which you
* use in the ShardIterator
parameter of the next
* GetRecords request.
*
*
* If a GetShardIterator request is made too often, you receive a
* ProvisionedThroughputExceededException
. For more information
* about throughput limits, see GetRecords, and Streams Limits in the Amazon Kinesis Streams Developer Guide.
*
*
* If the shard is closed, GetShardIterator returns a valid iterator
* for the last sequence number of the shard. Note that a shard can be
* closed as a result of using SplitShard or MergeShards.
*
*
* GetShardIterator has a limit of 5 transactions per second per
* account per open shard.
*
*
* @param getShardIteratorRequest
* Represents the input for GetShardIterator
.
* @return Result of the GetShardIterator operation returned by the service.
* @throws ResourceNotFoundException
* The requested resource could not be found. The stream might not
* be specified correctly, or it might not be in the
* ACTIVE
state if the operation requires it.
* @throws InvalidArgumentException
* A specified parameter exceeds its restrictions, is not supported,
* or can't be used. For more information, see the returned message.
* @throws ProvisionedThroughputExceededException
* The request rate for the stream is too high, or the requested
* data is too large for the available throughput. Reduce the
* frequency or size of your requests. For more information, see Streams Limits in the Amazon Kinesis Streams Developer
* Guide, and Error Retries and Exponential Backoff in AWS in the AWS
* General Reference.
* @sample AmazonKinesis.GetShardIterator
*/
@Override
public GetShardIteratorResult getShardIterator(
GetShardIteratorRequest getShardIteratorRequest) {
ExecutionContext executionContext = createExecutionContext(getShardIteratorRequest);
AWSRequestMetrics awsRequestMetrics = executionContext
.getAwsRequestMetrics();
awsRequestMetrics.startEvent(Field.ClientExecuteTime);
Request request = null;
Response response = null;
try {
awsRequestMetrics.startEvent(Field.RequestMarshallTime);
try {
request = new GetShardIteratorRequestMarshaller(protocolFactory)
.marshall(super
.beforeMarshalling(getShardIteratorRequest));
// Binds the request metrics to the current request.
request.setAWSRequestMetrics(awsRequestMetrics);
} finally {
awsRequestMetrics.endEvent(Field.RequestMarshallTime);
}
HttpResponseHandler> responseHandler = protocolFactory
.createResponseHandler(new JsonOperationMetadata()
.withPayloadJson(true)
.withHasStreamingSuccessResponse(false),
new GetShardIteratorResultJsonUnmarshaller());
response = invoke(request, responseHandler, executionContext);
return response.getAwsResponse();
} finally {
endClientExecution(awsRequestMetrics, request, response);
}
}
@Override
public GetShardIteratorResult getShardIterator(String streamName,
String shardId, String shardIteratorType) {
return getShardIterator(new GetShardIteratorRequest()
.withStreamName(streamName).withShardId(shardId)
.withShardIteratorType(shardIteratorType));
}
@Override
public GetShardIteratorResult getShardIterator(String streamName,
String shardId, String shardIteratorType,
String startingSequenceNumber) {
return getShardIterator(new GetShardIteratorRequest()
.withStreamName(streamName).withShardId(shardId)
.withShardIteratorType(shardIteratorType)
.withStartingSequenceNumber(startingSequenceNumber));
}
/**
*
* Increases the Amazon Kinesis stream's retention period, which is the
* length of time data records are accessible after they are added to the
* stream. The maximum value of a stream's retention period is 168 hours (7
* days).
*
*
* Upon choosing a longer stream retention period, this operation will
* increase the time period records are accessible that have not yet
* expired. However, it will not make previous data that has expired (older
* than the stream's previous retention period) accessible after the
* operation has been called. For example, if a stream's retention period is
* set to 24 hours and is increased to 168 hours, any data that is older
* than 24 hours will remain inaccessible to consumer applications.
*
*
* @param increaseStreamRetentionPeriodRequest
* Represents the input for IncreaseStreamRetentionPeriod.
* @return Result of the IncreaseStreamRetentionPeriod operation returned by
* the service.
* @throws ResourceInUseException
* The resource is not available for this operation. For successful
* operation, the resource needs to be in the ACTIVE
* state.
* @throws ResourceNotFoundException
* The requested resource could not be found. The stream might not
* be specified correctly, or it might not be in the
* ACTIVE
state if the operation requires it.
* @throws LimitExceededException
* The requested resource exceeds the maximum number allowed, or the
* number of concurrent stream requests exceeds the maximum number
* allowed (5).
* @throws InvalidArgumentException
* A specified parameter exceeds its restrictions, is not supported,
* or can't be used. For more information, see the returned message.
* @sample AmazonKinesis.IncreaseStreamRetentionPeriod
*/
@Override
public IncreaseStreamRetentionPeriodResult increaseStreamRetentionPeriod(
IncreaseStreamRetentionPeriodRequest increaseStreamRetentionPeriodRequest) {
ExecutionContext executionContext = createExecutionContext(increaseStreamRetentionPeriodRequest);
AWSRequestMetrics awsRequestMetrics = executionContext
.getAwsRequestMetrics();
awsRequestMetrics.startEvent(Field.ClientExecuteTime);
Request request = null;
Response response = null;
try {
awsRequestMetrics.startEvent(Field.RequestMarshallTime);
try {
request = new IncreaseStreamRetentionPeriodRequestMarshaller(
protocolFactory)
.marshall(super
.beforeMarshalling(increaseStreamRetentionPeriodRequest));
// Binds the request metrics to the current request.
request.setAWSRequestMetrics(awsRequestMetrics);
} finally {
awsRequestMetrics.endEvent(Field.RequestMarshallTime);
}
HttpResponseHandler> responseHandler = protocolFactory
.createResponseHandler(
new JsonOperationMetadata().withPayloadJson(true)
.withHasStreamingSuccessResponse(false),
new IncreaseStreamRetentionPeriodResultJsonUnmarshaller());
response = invoke(request, responseHandler, executionContext);
return response.getAwsResponse();
} finally {
endClientExecution(awsRequestMetrics, request, response);
}
}
/**
*
* Lists your Amazon Kinesis streams.
*
*
* The number of streams may be too large to return from a single call to
* ListStreams
. You can limit the number of returned streams
* using the Limit
parameter. If you do not specify a value for
* the Limit
parameter, Amazon Kinesis uses the default limit,
* which is currently 10.
*
*
* You can detect if there are more streams available to list by using the
* HasMoreStreams
flag from the returned output. If there are
* more streams available, you can request more streams by using the name of
* the last stream returned by the ListStreams
request in the
* ExclusiveStartStreamName
parameter in a subsequent request
* to ListStreams
. The group of stream names returned by the
* subsequent request is then added to the list. You can continue this
* process until all the stream names have been collected in the list.
*
*
* ListStreams has a limit of 5 transactions per second per account.
*
*
* @param listStreamsRequest
* Represents the input for ListStreams
.
* @return Result of the ListStreams operation returned by the service.
* @throws LimitExceededException
* The requested resource exceeds the maximum number allowed, or the
* number of concurrent stream requests exceeds the maximum number
* allowed (5).
* @sample AmazonKinesis.ListStreams
*/
@Override
public ListStreamsResult listStreams(ListStreamsRequest listStreamsRequest) {
ExecutionContext executionContext = createExecutionContext(listStreamsRequest);
AWSRequestMetrics awsRequestMetrics = executionContext
.getAwsRequestMetrics();
awsRequestMetrics.startEvent(Field.ClientExecuteTime);
Request request = null;
Response response = null;
try {
awsRequestMetrics.startEvent(Field.RequestMarshallTime);
try {
request = new ListStreamsRequestMarshaller(protocolFactory)
.marshall(super.beforeMarshalling(listStreamsRequest));
// Binds the request metrics to the current request.
request.setAWSRequestMetrics(awsRequestMetrics);
} finally {
awsRequestMetrics.endEvent(Field.RequestMarshallTime);
}
HttpResponseHandler> responseHandler = protocolFactory
.createResponseHandler(new JsonOperationMetadata()
.withPayloadJson(true)
.withHasStreamingSuccessResponse(false),
new ListStreamsResultJsonUnmarshaller());
response = invoke(request, responseHandler, executionContext);
return response.getAwsResponse();
} finally {
endClientExecution(awsRequestMetrics, request, response);
}
}
@Override
public ListStreamsResult listStreams() {
return listStreams(new ListStreamsRequest());
}
@Override
public ListStreamsResult listStreams(String exclusiveStartStreamName) {
return listStreams(new ListStreamsRequest()
.withExclusiveStartStreamName(exclusiveStartStreamName));
}
@Override
public ListStreamsResult listStreams(Integer limit,
String exclusiveStartStreamName) {
return listStreams(new ListStreamsRequest().withLimit(limit)
.withExclusiveStartStreamName(exclusiveStartStreamName));
}
/**
*
* Lists the tags for the specified Amazon Kinesis stream.
*
*
* @param listTagsForStreamRequest
* Represents the input for ListTagsForStream
.
* @return Result of the ListTagsForStream operation returned by the
* service.
* @throws ResourceNotFoundException
* The requested resource could not be found. The stream might not
* be specified correctly, or it might not be in the
* ACTIVE
state if the operation requires it.
* @throws InvalidArgumentException
* A specified parameter exceeds its restrictions, is not supported,
* or can't be used. For more information, see the returned message.
* @throws LimitExceededException
* The requested resource exceeds the maximum number allowed, or the
* number of concurrent stream requests exceeds the maximum number
* allowed (5).
* @sample AmazonKinesis.ListTagsForStream
*/
@Override
public ListTagsForStreamResult listTagsForStream(
ListTagsForStreamRequest listTagsForStreamRequest) {
ExecutionContext executionContext = createExecutionContext(listTagsForStreamRequest);
AWSRequestMetrics awsRequestMetrics = executionContext
.getAwsRequestMetrics();
awsRequestMetrics.startEvent(Field.ClientExecuteTime);
Request request = null;
Response response = null;
try {
awsRequestMetrics.startEvent(Field.RequestMarshallTime);
try {
request = new ListTagsForStreamRequestMarshaller(
protocolFactory).marshall(super
.beforeMarshalling(listTagsForStreamRequest));
// Binds the request metrics to the current request.
request.setAWSRequestMetrics(awsRequestMetrics);
} finally {
awsRequestMetrics.endEvent(Field.RequestMarshallTime);
}
HttpResponseHandler> responseHandler = protocolFactory
.createResponseHandler(new JsonOperationMetadata()
.withPayloadJson(true)
.withHasStreamingSuccessResponse(false),
new ListTagsForStreamResultJsonUnmarshaller());
response = invoke(request, responseHandler, executionContext);
return response.getAwsResponse();
} finally {
endClientExecution(awsRequestMetrics, request, response);
}
}
/**
*
* Merges two adjacent shards in an Amazon Kinesis stream and combines them
* into a single shard to reduce the stream's capacity to ingest and
* transport data. Two shards are considered adjacent if the union of the
* hash key ranges for the two shards form a contiguous set with no gaps.
* For example, if you have two shards, one with a hash key range of
* 276...381 and the other with a hash key range of 382...454, then you
* could merge these two shards into a single shard that would have a hash
* key range of 276...454. After the merge, the single child shard receives
* data for all hash key values covered by the two parent shards.
*
*
* MergeShards
is called when there is a need to reduce the
* overall capacity of a stream because of excess capacity that is not being
* used. You must specify the shard to be merged and the adjacent shard for
* a stream. For more information about merging shards, see Merge Two Shards in the Amazon Kinesis Streams Developer
* Guide.
*
*
* If the stream is in the ACTIVE
state, you can call
* MergeShards
. If a stream is in the CREATING
,
* UPDATING
, or DELETING
state,
* MergeShards
returns a ResourceInUseException
.
* If the specified stream does not exist, MergeShards
returns
* a ResourceNotFoundException
.
*
*
* You can use DescribeStream to check the state of the stream, which
* is returned in StreamStatus
.
*
*
* MergeShards
is an asynchronous operation. Upon receiving a
* MergeShards
request, Amazon Kinesis immediately returns a
* response and sets the StreamStatus
to UPDATING
.
* After the operation is completed, Amazon Kinesis sets the
* StreamStatus
to ACTIVE
. Read and write
* operations continue to work while the stream is in the
* UPDATING
state.
*
*
* You use DescribeStream to determine the shard IDs that are
* specified in the MergeShards
request.
*
*
* If you try to operate on too many streams in parallel using
* CreateStream, DeleteStream, MergeShards
or
* SplitShard, you will receive a LimitExceededException
* .
*
*
* MergeShards
has limit of 5 transactions per second per
* account.
*
*
* @param mergeShardsRequest
* Represents the input for MergeShards
.
* @return Result of the MergeShards operation returned by the service.
* @throws ResourceNotFoundException
* The requested resource could not be found. The stream might not
* be specified correctly, or it might not be in the
* ACTIVE
state if the operation requires it.
* @throws ResourceInUseException
* The resource is not available for this operation. For successful
* operation, the resource needs to be in the ACTIVE
* state.
* @throws InvalidArgumentException
* A specified parameter exceeds its restrictions, is not supported,
* or can't be used. For more information, see the returned message.
* @throws LimitExceededException
* The requested resource exceeds the maximum number allowed, or the
* number of concurrent stream requests exceeds the maximum number
* allowed (5).
* @sample AmazonKinesis.MergeShards
*/
@Override
public MergeShardsResult mergeShards(MergeShardsRequest mergeShardsRequest) {
ExecutionContext executionContext = createExecutionContext(mergeShardsRequest);
AWSRequestMetrics awsRequestMetrics = executionContext
.getAwsRequestMetrics();
awsRequestMetrics.startEvent(Field.ClientExecuteTime);
Request request = null;
Response response = null;
try {
awsRequestMetrics.startEvent(Field.RequestMarshallTime);
try {
request = new MergeShardsRequestMarshaller(protocolFactory)
.marshall(super.beforeMarshalling(mergeShardsRequest));
// Binds the request metrics to the current request.
request.setAWSRequestMetrics(awsRequestMetrics);
} finally {
awsRequestMetrics.endEvent(Field.RequestMarshallTime);
}
HttpResponseHandler> responseHandler = protocolFactory
.createResponseHandler(new JsonOperationMetadata()
.withPayloadJson(true)
.withHasStreamingSuccessResponse(false),
new MergeShardsResultJsonUnmarshaller());
response = invoke(request, responseHandler, executionContext);
return response.getAwsResponse();
} finally {
endClientExecution(awsRequestMetrics, request, response);
}
}
@Override
public MergeShardsResult mergeShards(String streamName,
String shardToMerge, String adjacentShardToMerge) {
return mergeShards(new MergeShardsRequest().withStreamName(streamName)
.withShardToMerge(shardToMerge)
.withAdjacentShardToMerge(adjacentShardToMerge));
}
/**
*
* Writes a single data record into an Amazon Kinesis stream. Call
* PutRecord
to send data into the stream for real-time
* ingestion and subsequent processing, one record at a time. Each shard can
* support writes up to 1,000 records per second, up to a maximum data write
* total of 1 MB per second.
*
*
* You must specify the name of the stream that captures, stores, and
* transports the data; a partition key; and the data blob itself.
*
*
* The data blob can be any type of data; for example, a segment from a log
* file, geographic/location data, website clickstream data, and so on.
*
*
* The partition key is used by Amazon Kinesis to distribute data across
* shards. Amazon Kinesis segregates the data records that belong to a
* stream into multiple shards, using the partition key associated with each
* data record to determine which shard a given data record belongs to.
*
*
* Partition keys are Unicode strings, with a maximum length limit of 256
* characters for each key. An MD5 hash function is used to map partition
* keys to 128-bit integer values and to map associated data records to
* shards using the hash key ranges of the shards. You can override hashing
* the partition key to determine the shard by explicitly specifying a hash
* value using the ExplicitHashKey
parameter. For more
* information, see Adding Data to a Stream in the Amazon Kinesis Streams Developer
* Guide.
*
*
* PutRecord
returns the shard ID of where the data record was
* placed and the sequence number that was assigned to the data record.
*
*
* Sequence numbers increase over time and are specific to a shard within a
* stream, not across all shards within a stream. To guarantee strictly
* increasing ordering, write serially to a shard and use the
* SequenceNumberForOrdering
parameter. For more information,
* see Adding Data to a Stream in the Amazon Kinesis Streams Developer
* Guide.
*
*
* If a PutRecord
request cannot be processed because of
* insufficient provisioned throughput on the shard involved in the request,
* PutRecord
throws
* ProvisionedThroughputExceededException
.
*
*
* Data records are accessible for only 24 hours from the time that they are
* added to a stream.
*
*
* @param putRecordRequest
* Represents the input for PutRecord
.
* @return Result of the PutRecord operation returned by the service.
* @throws ResourceNotFoundException
* The requested resource could not be found. The stream might not
* be specified correctly, or it might not be in the
* ACTIVE
state if the operation requires it.
* @throws InvalidArgumentException
* A specified parameter exceeds its restrictions, is not supported,
* or can't be used. For more information, see the returned message.
* @throws ProvisionedThroughputExceededException
* The request rate for the stream is too high, or the requested
* data is too large for the available throughput. Reduce the
* frequency or size of your requests. For more information, see Streams Limits in the Amazon Kinesis Streams Developer
* Guide, and Error Retries and Exponential Backoff in AWS in the AWS
* General Reference.
* @sample AmazonKinesis.PutRecord
*/
@Override
public PutRecordResult putRecord(PutRecordRequest putRecordRequest) {
ExecutionContext executionContext = createExecutionContext(putRecordRequest);
AWSRequestMetrics awsRequestMetrics = executionContext
.getAwsRequestMetrics();
awsRequestMetrics.startEvent(Field.ClientExecuteTime);
Request request = null;
Response response = null;
try {
awsRequestMetrics.startEvent(Field.RequestMarshallTime);
try {
request = new PutRecordRequestMarshaller(protocolFactory)
.marshall(super.beforeMarshalling(putRecordRequest));
// Binds the request metrics to the current request.
request.setAWSRequestMetrics(awsRequestMetrics);
} finally {
awsRequestMetrics.endEvent(Field.RequestMarshallTime);
}
HttpResponseHandler> responseHandler = protocolFactory
.createResponseHandler(new JsonOperationMetadata()
.withPayloadJson(true)
.withHasStreamingSuccessResponse(false),
new PutRecordResultJsonUnmarshaller());
response = invoke(request, responseHandler, executionContext);
return response.getAwsResponse();
} finally {
endClientExecution(awsRequestMetrics, request, response);
}
}
@Override
public PutRecordResult putRecord(String streamName,
java.nio.ByteBuffer data, String partitionKey) {
return putRecord(new PutRecordRequest().withStreamName(streamName)
.withData(data).withPartitionKey(partitionKey));
}
@Override
public PutRecordResult putRecord(String streamName,
java.nio.ByteBuffer data, String partitionKey,
String sequenceNumberForOrdering) {
return putRecord(new PutRecordRequest().withStreamName(streamName)
.withData(data).withPartitionKey(partitionKey)
.withSequenceNumberForOrdering(sequenceNumberForOrdering));
}
/**
*
* Writes multiple data records into an Amazon Kinesis stream in a single
* call (also referred to as a PutRecords
request). Use this
* operation to send data into the stream for data ingestion and processing.
*
*
* Each PutRecords
request can support up to 500 records. Each
* record in the request can be as large as 1 MB, up to a limit of 5 MB for
* the entire request, including partition keys. Each shard can support
* writes up to 1,000 records per second, up to a maximum data write total
* of 1 MB per second.
*
*
* You must specify the name of the stream that captures, stores, and
* transports the data; and an array of request Records
, with
* each record in the array requiring a partition key and data blob. The
* record size limit applies to the total size of the partition key and data
* blob.
*
*
* The data blob can be any type of data; for example, a segment from a log
* file, geographic/location data, website clickstream data, and so on.
*
*
* The partition key is used by Amazon Kinesis as input to a hash function
* that maps the partition key and associated data to a specific shard. An
* MD5 hash function is used to map partition keys to 128-bit integer values
* and to map associated data records to shards. As a result of this hashing
* mechanism, all data records with the same partition key map to the same
* shard within the stream. For more information, see Adding Data to a Stream in the Amazon Kinesis Streams Developer
* Guide.
*
*
* Each record in the Records
array may include an optional
* parameter, ExplicitHashKey
, which overrides the partition
* key to shard mapping. This parameter allows a data producer to determine
* explicitly the shard where the record is stored. For more information,
* see Adding Multiple Records with PutRecords in the Amazon Kinesis
* Streams Developer Guide.
*
*
* The PutRecords
response includes an array of response
* Records
. Each record in the response array directly
* correlates with a record in the request array using natural ordering,
* from the top to the bottom of the request and response. The response
* Records
array always includes the same number of records as
* the request array.
*
*
* The response Records
array includes both successfully and
* unsuccessfully processed records. Amazon Kinesis attempts to process all
* records in each PutRecords
request. A single record failure
* does not stop the processing of subsequent records.
*
*
* A successfully-processed record includes ShardId
and
* SequenceNumber
values. The ShardId
parameter
* identifies the shard in the stream where the record is stored. The
* SequenceNumber
parameter is an identifier assigned to the
* put record, unique to all records in the stream.
*
*
* An unsuccessfully-processed record includes ErrorCode
and
* ErrorMessage
values. ErrorCode
reflects the
* type of error and can be one of the following values:
* ProvisionedThroughputExceededException
or
* InternalFailure
. ErrorMessage
provides more
* detailed information about the
* ProvisionedThroughputExceededException
exception including
* the account ID, stream name, and shard ID of the record that was
* throttled. For more information about partially successful responses, see
* Adding Multiple Records with PutRecords in the Amazon Kinesis
* Streams Developer Guide.
*
*
* By default, data records are accessible for only 24 hours from the time
* that they are added to an Amazon Kinesis stream. This retention period
* can be modified using the DecreaseStreamRetentionPeriod and
* IncreaseStreamRetentionPeriod operations.
*
*
* @param putRecordsRequest
* A PutRecords
request.
* @return Result of the PutRecords operation returned by the service.
* @throws ResourceNotFoundException
* The requested resource could not be found. The stream might not
* be specified correctly, or it might not be in the
* ACTIVE
state if the operation requires it.
* @throws InvalidArgumentException
* A specified parameter exceeds its restrictions, is not supported,
* or can't be used. For more information, see the returned message.
* @throws ProvisionedThroughputExceededException
* The request rate for the stream is too high, or the requested
* data is too large for the available throughput. Reduce the
* frequency or size of your requests. For more information, see Streams Limits in the Amazon Kinesis Streams Developer
* Guide, and Error Retries and Exponential Backoff in AWS in the AWS
* General Reference.
* @sample AmazonKinesis.PutRecords
*/
@Override
public PutRecordsResult putRecords(PutRecordsRequest putRecordsRequest) {
ExecutionContext executionContext = createExecutionContext(putRecordsRequest);
AWSRequestMetrics awsRequestMetrics = executionContext
.getAwsRequestMetrics();
awsRequestMetrics.startEvent(Field.ClientExecuteTime);
Request request = null;
Response response = null;
try {
awsRequestMetrics.startEvent(Field.RequestMarshallTime);
try {
request = new PutRecordsRequestMarshaller(protocolFactory)
.marshall(super.beforeMarshalling(putRecordsRequest));
// Binds the request metrics to the current request.
request.setAWSRequestMetrics(awsRequestMetrics);
} finally {
awsRequestMetrics.endEvent(Field.RequestMarshallTime);
}
HttpResponseHandler> responseHandler = protocolFactory
.createResponseHandler(new JsonOperationMetadata()
.withPayloadJson(true)
.withHasStreamingSuccessResponse(false),
new PutRecordsResultJsonUnmarshaller());
response = invoke(request, responseHandler, executionContext);
return response.getAwsResponse();
} finally {
endClientExecution(awsRequestMetrics, request, response);
}
}
/**
*
* Removes tags from the specified Amazon Kinesis stream. Removed tags are
* deleted and cannot be recovered after this operation successfully
* completes.
*
*
* If you specify a tag that does not exist, it is ignored.
*
*
* @param removeTagsFromStreamRequest
* Represents the input for RemoveTagsFromStream
.
* @return Result of the RemoveTagsFromStream operation returned by the
* service.
* @throws ResourceNotFoundException
* The requested resource could not be found. The stream might not
* be specified correctly, or it might not be in the
* ACTIVE
state if the operation requires it.
* @throws ResourceInUseException
* The resource is not available for this operation. For successful
* operation, the resource needs to be in the ACTIVE
* state.
* @throws InvalidArgumentException
* A specified parameter exceeds its restrictions, is not supported,
* or can't be used. For more information, see the returned message.
* @throws LimitExceededException
* The requested resource exceeds the maximum number allowed, or the
* number of concurrent stream requests exceeds the maximum number
* allowed (5).
* @sample AmazonKinesis.RemoveTagsFromStream
*/
@Override
public RemoveTagsFromStreamResult removeTagsFromStream(
RemoveTagsFromStreamRequest removeTagsFromStreamRequest) {
ExecutionContext executionContext = createExecutionContext(removeTagsFromStreamRequest);
AWSRequestMetrics awsRequestMetrics = executionContext
.getAwsRequestMetrics();
awsRequestMetrics.startEvent(Field.ClientExecuteTime);
Request request = null;
Response response = null;
try {
awsRequestMetrics.startEvent(Field.RequestMarshallTime);
try {
request = new RemoveTagsFromStreamRequestMarshaller(
protocolFactory).marshall(super
.beforeMarshalling(removeTagsFromStreamRequest));
// Binds the request metrics to the current request.
request.setAWSRequestMetrics(awsRequestMetrics);
} finally {
awsRequestMetrics.endEvent(Field.RequestMarshallTime);
}
HttpResponseHandler> responseHandler = protocolFactory
.createResponseHandler(new JsonOperationMetadata()
.withPayloadJson(true)
.withHasStreamingSuccessResponse(false),
new RemoveTagsFromStreamResultJsonUnmarshaller());
response = invoke(request, responseHandler, executionContext);
return response.getAwsResponse();
} finally {
endClientExecution(awsRequestMetrics, request, response);
}
}
/**
*
* Splits a shard into two new shards in the Amazon Kinesis stream to
* increase the stream's capacity to ingest and transport data.
* SplitShard
is called when there is a need to increase the
* overall capacity of a stream because of an expected increase in the
* volume of data records being ingested.
*
*
* You can also use SplitShard
when a shard appears to be
* approaching its maximum utilization; for example, the producers sending
* data into the specific shard are suddenly sending more than previously
* anticipated. You can also call SplitShard
to increase stream
* capacity, so that more Amazon Kinesis applications can simultaneously
* read data from the stream for real-time processing.
*
*
* You must specify the shard to be split and the new hash key, which is the
* position in the shard where the shard gets split in two. In many cases,
* the new hash key might simply be the average of the beginning and ending
* hash key, but it can be any hash key value in the range being mapped into
* the shard. For more information about splitting shards, see Split a Shard in the Amazon Kinesis Streams Developer Guide.
*
*
* You can use DescribeStream to determine the shard ID and hash key
* values for the ShardToSplit
and
* NewStartingHashKey
parameters that are specified in the
* SplitShard
request.
*
*
* SplitShard
is an asynchronous operation. Upon receiving a
* SplitShard
request, Amazon Kinesis immediately returns a
* response and sets the stream status to UPDATING
. After the
* operation is completed, Amazon Kinesis sets the stream status to
* ACTIVE
. Read and write operations continue to work while the
* stream is in the UPDATING
state.
*
*
* You can use DescribeStream
to check the status of the
* stream, which is returned in StreamStatus
. If the stream is
* in the ACTIVE
state, you can call SplitShard
.
* If a stream is in CREATING
or UPDATING
or
* DELETING
states, DescribeStream
returns a
* ResourceInUseException
.
*
*
* If the specified stream does not exist, DescribeStream
* returns a ResourceNotFoundException
. If you try to create
* more shards than are authorized for your account, you receive a
* LimitExceededException
.
*
*
* For the default shard limit for an AWS account, see Streams Limits in the Amazon Kinesis Streams Developer Guide.
* If you need to increase this limit, contact AWS Support.
*
*
* If you try to operate on too many streams simultaneously using
* CreateStream, DeleteStream, MergeShards, and/or
* SplitShard, you receive a LimitExceededException
.
*
*
* SplitShard
has limit of 5 transactions per second per
* account.
*
*
* @param splitShardRequest
* Represents the input for SplitShard
.
* @return Result of the SplitShard operation returned by the service.
* @throws ResourceNotFoundException
* The requested resource could not be found. The stream might not
* be specified correctly, or it might not be in the
* ACTIVE
state if the operation requires it.
* @throws ResourceInUseException
* The resource is not available for this operation. For successful
* operation, the resource needs to be in the ACTIVE
* state.
* @throws InvalidArgumentException
* A specified parameter exceeds its restrictions, is not supported,
* or can't be used. For more information, see the returned message.
* @throws LimitExceededException
* The requested resource exceeds the maximum number allowed, or the
* number of concurrent stream requests exceeds the maximum number
* allowed (5).
* @sample AmazonKinesis.SplitShard
*/
@Override
public SplitShardResult splitShard(SplitShardRequest splitShardRequest) {
ExecutionContext executionContext = createExecutionContext(splitShardRequest);
AWSRequestMetrics awsRequestMetrics = executionContext
.getAwsRequestMetrics();
awsRequestMetrics.startEvent(Field.ClientExecuteTime);
Request request = null;
Response response = null;
try {
awsRequestMetrics.startEvent(Field.RequestMarshallTime);
try {
request = new SplitShardRequestMarshaller(protocolFactory)
.marshall(super.beforeMarshalling(splitShardRequest));
// Binds the request metrics to the current request.
request.setAWSRequestMetrics(awsRequestMetrics);
} finally {
awsRequestMetrics.endEvent(Field.RequestMarshallTime);
}
HttpResponseHandler> responseHandler = protocolFactory
.createResponseHandler(new JsonOperationMetadata()
.withPayloadJson(true)
.withHasStreamingSuccessResponse(false),
new SplitShardResultJsonUnmarshaller());
response = invoke(request, responseHandler, executionContext);
return response.getAwsResponse();
} finally {
endClientExecution(awsRequestMetrics, request, response);
}
}
@Override
public SplitShardResult splitShard(String streamName, String shardToSplit,
String newStartingHashKey) {
return splitShard(new SplitShardRequest().withStreamName(streamName)
.withShardToSplit(shardToSplit)
.withNewStartingHashKey(newStartingHashKey));
}
/**
* Returns additional metadata for a previously executed successful,
* request, typically used for debugging issues where a service isn't acting
* as expected. This data isn't considered part of the result data returned
* by an operation, so it's available through this separate, diagnostic
* interface.
*
* Response metadata is only cached for a limited period of time, so if you
* need to access this extra diagnostic information for an executed request,
* you should use this method to retrieve it as soon as possible after
* executing the request.
*
* @param request
* The originally executed request
*
* @return The response metadata for the specified request, or null if none
* is available.
*/
public ResponseMetadata getCachedResponseMetadata(
AmazonWebServiceRequest request) {
return client.getResponseMetadataForRequest(request);
}
/**
* Normal invoke with authentication. Credentials are required and may be
* overriden at the request level.
**/
private Response invoke(
Request request,
HttpResponseHandler> responseHandler,
ExecutionContext executionContext) {
executionContext.setCredentialsProvider(CredentialUtils
.getCredentialsProvider(request.getOriginalRequest(),
awsCredentialsProvider));
return doInvoke(request, responseHandler, executionContext);
}
/**
* Invoke with no authentication. Credentials are not required and any
* credentials set on the client or request will be ignored for this
* operation.
**/
private Response anonymousInvoke(
Request request,
HttpResponseHandler> responseHandler,
ExecutionContext executionContext) {
return doInvoke(request, responseHandler, executionContext);
}
/**
* Invoke the request using the http client. Assumes credentials (or lack
* thereof) have been configured in the ExecutionContext beforehand.
**/
private Response doInvoke(
Request request,
HttpResponseHandler> responseHandler,
ExecutionContext executionContext) {
request.setEndpoint(endpoint);
request.setTimeOffset(timeOffset);
HttpResponseHandler errorResponseHandler = protocolFactory
.createErrorResponseHandler(new JsonErrorResponseMetadata());
return client.execute(request, responseHandler, errorResponseHandler,
executionContext);
}
public AmazonKinesisWaiters waiters() {
if (waiters == null) {
synchronized (this) {
if (waiters == null) {
waiters = new AmazonKinesisWaiters(this);
}
}
}
return waiters;
}
}