Example usage for com.amazonaws.services.kinesis.model ResourceNotFoundException setServiceName

List of usage examples for com.amazonaws.services.kinesis.model ResourceNotFoundException setServiceName

Introduction

In this page you can find the example usage for com.amazonaws.services.kinesis.model ResourceNotFoundException setServiceName.

Prototype

public void setServiceName(String serviceName) 

Source Link

Document

Sets the name of the service that sent this error response.

Usage

From source file:org.springframework.cloud.stream.binder.kinesis.provisioning.KinesisStreamProvisioner.java

License:Apache License

private List<Shard> createOrUpdate(String stream, int shards) {
    List<Shard> shardList = new ArrayList<>();

    int describeStreamRetries = 0;

    String exclusiveStartShardId = null;

    DescribeStreamRequest describeStreamRequest = new DescribeStreamRequest().withStreamName(stream);

    while (true) {
        DescribeStreamResult describeStreamResult = null;

        try {/*from w  w w.  j a v a  2 s  .c  om*/
            describeStreamRequest.withExclusiveStartShardId(exclusiveStartShardId);
            describeStreamResult = this.amazonKinesis.describeStream(describeStreamRequest);
            StreamDescription streamDescription = describeStreamResult.getStreamDescription();
            if (StreamStatus.ACTIVE.toString().equals(streamDescription.getStreamStatus())) {
                shardList.addAll(streamDescription.getShards());

                if (streamDescription.getHasMoreShards()) {
                    exclusiveStartShardId = shardList.get(shardList.size() - 1).getShardId();
                } else {
                    break;
                }
            }
        } catch (ResourceNotFoundException ex) {
            if (!this.configurationProperties.isAutoCreateStream()) {
                throw new ProvisioningException(
                        "The stream [" + stream + "] was not found and auto creation is disabled.", ex);
            }
            if (logger.isInfoEnabled()) {
                logger.info("Stream '" + stream + "' not found. Create one...");
            }

            this.amazonKinesis.createStream(stream,
                    Math.max(this.configurationProperties.getMinShardCount(), shards));
            continue;
        } catch (LimitExceededException ex) {
            logger.info(
                    "Got LimitExceededException when describing stream [" + stream + "]. " + "Backing off for ["
                            + this.configurationProperties.getDescribeStreamBackoff() + "] millis.");
        }

        if (describeStreamResult == null || !StreamStatus.ACTIVE.toString()
                .equals(describeStreamResult.getStreamDescription().getStreamStatus())) {
            if (describeStreamRetries++ > this.configurationProperties.getDescribeStreamRetries()) {
                ResourceNotFoundException resourceNotFoundException = new ResourceNotFoundException(
                        "The stream [" + stream + "] isn't ACTIVE or doesn't exist.");
                resourceNotFoundException.setServiceName("Kinesis");
                throw new ProvisioningException(
                        "Kinesis org.springframework.cloud.stream.binder.kinesis.provisioning error",
                        resourceNotFoundException);
            }
            try {
                Thread.sleep(this.configurationProperties.getDescribeStreamBackoff());
            } catch (InterruptedException ex) {
                Thread.currentThread().interrupt();
                throw new ProvisioningException(
                        "The [describeStream] thread for the stream [" + stream + "] has been interrupted.",
                        ex);
            }
        }
    }

    int effectiveShardCount = Math.max(this.configurationProperties.getMinShardCount(), shards);

    if ((shardList.size() < effectiveShardCount) && this.configurationProperties.isAutoAddShards()) {
        return updateShardCount(stream, shardList.size(), effectiveShardCount);
    }

    return shardList;
}

From source file:org.springframework.cloud.stream.binder.kinesis.provisioning.KinesisStreamProvisioner.java

License:Apache License

private List<Shard> updateShardCount(String streamName, int shardCount, int targetCount) {
    if (logger.isInfoEnabled()) {
        logger.info("Stream [" + streamName + "] has [" + shardCount
                + "] shards compared to a target configuration of [" + targetCount + "], creating shards...");
    }// w ww .  j  a v a2s.c  o  m

    UpdateShardCountRequest updateShardCountRequest = new UpdateShardCountRequest().withStreamName(streamName)
            .withTargetShardCount(targetCount).withScalingType(ScalingType.UNIFORM_SCALING);

    this.amazonKinesis.updateShardCount(updateShardCountRequest);

    // Wait for stream to become active again after resharding
    List<Shard> shardList = new ArrayList<>();

    int describeStreamRetries = 0;

    String exclusiveStartShardId = null;

    DescribeStreamRequest describeStreamRequest = new DescribeStreamRequest().withStreamName(streamName);

    while (true) {
        DescribeStreamResult describeStreamResult = null;

        try {
            describeStreamRequest.withExclusiveStartShardId(exclusiveStartShardId);
            describeStreamResult = this.amazonKinesis.describeStream(describeStreamRequest);
            StreamDescription streamDescription = describeStreamResult.getStreamDescription();
            if (StreamStatus.ACTIVE.toString().equals(streamDescription.getStreamStatus())) {
                shardList.addAll(streamDescription.getShards());

                if (streamDescription.getHasMoreShards()) {
                    exclusiveStartShardId = shardList.get(shardList.size() - 1).getShardId();
                } else {
                    break;
                }
            }
        } catch (LimitExceededException ex) {
            logger.info("Got LimitExceededException when describing stream [" + streamName + "]. "
                    + "Backing off for [" + this.configurationProperties.getDescribeStreamBackoff()
                    + "] millis.");
        }

        if (describeStreamResult == null || !StreamStatus.ACTIVE.toString()
                .equals(describeStreamResult.getStreamDescription().getStreamStatus())) {
            if (describeStreamRetries++ > this.configurationProperties.getDescribeStreamRetries()) {
                ResourceNotFoundException resourceNotFoundException = new ResourceNotFoundException(
                        "The stream [" + streamName + "] isn't ACTIVE or doesn't exist.");
                resourceNotFoundException.setServiceName("Kinesis");
                throw new ProvisioningException(
                        "Kinesis org.springframework.cloud.stream.binder.kinesis.provisioning error",
                        resourceNotFoundException);
            }
            try {
                Thread.sleep(this.configurationProperties.getDescribeStreamBackoff());
            } catch (InterruptedException ex) {
                Thread.currentThread().interrupt();
                throw new ProvisioningException(
                        "The [describeStream] thread for the stream [" + streamName + "] has been interrupted.",
                        ex);
            }
        }
    }
    return shardList;
}

From source file:org.springframework.integration.aws.inbound.kinesis.KinesisMessageDrivenChannelAdapter.java

License:Apache License

private void populateShardsForStream(final String stream, final CountDownLatch shardsGatherLatch) {
    this.dispatcherExecutor.execute(new Runnable() {

        @Override/*w ww  . j a  v  a 2  s .co  m*/
        public void run() {
            try {
                int describeStreamRetries = 0;
                List<Shard> shardsToConsume = new ArrayList<>();

                String exclusiveStartShardId = null;
                while (true) {
                    DescribeStreamRequest describeStreamRequest = new DescribeStreamRequest()
                            .withStreamName(stream).withExclusiveStartShardId(exclusiveStartShardId);

                    DescribeStreamResult describeStreamResult = null;
                    // Call DescribeStream, with backoff and retries (if we get LimitExceededException).
                    try {
                        describeStreamResult = KinesisMessageDrivenChannelAdapter.this.amazonKinesis
                                .describeStream(describeStreamRequest);
                    } catch (LimitExceededException e) {
                        logger.info("Got LimitExceededException when describing stream [" + stream + "]. "
                                + "Backing off for ["
                                + KinesisMessageDrivenChannelAdapter.this.describeStreamBackoff + "] millis.");
                    }

                    if (describeStreamResult == null || !StreamStatus.ACTIVE.toString()
                            .equals(describeStreamResult.getStreamDescription().getStreamStatus())) {
                        if (describeStreamRetries++ > KinesisMessageDrivenChannelAdapter.this.describeStreamRetries) {
                            ResourceNotFoundException resourceNotFoundException = new ResourceNotFoundException(
                                    "The stream [" + stream + "] isn't ACTIVE or doesn't exist.");
                            resourceNotFoundException.setServiceName("Kinesis");
                            throw resourceNotFoundException;
                        }
                        try {
                            Thread.sleep(KinesisMessageDrivenChannelAdapter.this.describeStreamBackoff);
                            continue;
                        } catch (InterruptedException e) {
                            Thread.interrupted();
                            throw new IllegalStateException("The [describeStream] thread for the stream ["
                                    + stream + "] has been interrupted.", e);
                        }
                    }

                    List<Shard> shards = describeStreamResult.getStreamDescription().getShards();
                    for (Shard shard : shards) {
                        String endingSequenceNumber = shard.getSequenceNumberRange().getEndingSequenceNumber();
                        if (endingSequenceNumber != null) {
                            String key = buildCheckpointKeyForShard(stream, shard.getShardId());
                            String checkpoint = KinesisMessageDrivenChannelAdapter.this.checkpointStore
                                    .get(key);

                            boolean skipClosedShard = checkpoint != null && new BigInteger(endingSequenceNumber)
                                    .compareTo(new BigInteger(checkpoint)) <= 0;

                            if (logger.isTraceEnabled()) {
                                logger.trace("The shard [" + shard + "] in stream [" + stream
                                        + "] is closed CLOSED with endingSequenceNumber ["
                                        + endingSequenceNumber + "].\nThe last processed checkpoint is ["
                                        + checkpoint + "]."
                                        + (skipClosedShard ? "\nThe shard will be skipped." : ""));
                            }

                            if (skipClosedShard) {
                                // Skip CLOSED shard which has been read before according a checkpoint
                                continue;
                            }
                        }

                        shardsToConsume.add(shard);
                    }

                    if (describeStreamResult.getStreamDescription().getHasMoreShards()) {
                        exclusiveStartShardId = shards.get(shards.size() - 1).getShardId();
                    } else {
                        break;
                    }
                }

                for (Shard shard : shardsToConsume) {
                    KinesisShardOffset shardOffset = new KinesisShardOffset(
                            KinesisMessageDrivenChannelAdapter.this.streamInitialSequence);
                    shardOffset.setShard(shard.getShardId());
                    shardOffset.setStream(stream);
                    boolean addedOffset;
                    synchronized (KinesisMessageDrivenChannelAdapter.this.shardOffsets) {
                        addedOffset = KinesisMessageDrivenChannelAdapter.this.shardOffsets.add(shardOffset);
                    }
                    if (addedOffset && shardsGatherLatch == null
                            && KinesisMessageDrivenChannelAdapter.this.active) {
                        populateConsumer(shardOffset);
                    }
                }
            } finally {
                if (shardsGatherLatch != null) {
                    shardsGatherLatch.countDown();
                }
                KinesisMessageDrivenChannelAdapter.this.inResharding.remove(stream);
            }
        }

    });
}