From fc34f814e557936d1bcb815d0879bd4f6e035675 Mon Sep 17 00:00:00 2001 From: Artem Bilan Date: Tue, 10 Jul 2018 13:46:30 -0400 Subject: [PATCH] Fix DynamoDbMetadataStore.initialized flag logic https://stackoverflow.com/questions/51257855/spring-cloud-aws-kinesis-stream-binder-failed-to-start-due-to-improper-bean-init --- .../aws/metadata/DynamoDbMetadataStore.java | 129 +++++++++--------- 1 file changed, 66 insertions(+), 63 deletions(-) diff --git a/src/main/java/org/springframework/integration/aws/metadata/DynamoDbMetadataStore.java b/src/main/java/org/springframework/integration/aws/metadata/DynamoDbMetadataStore.java index 7b87414..978490c 100644 --- a/src/main/java/org/springframework/integration/aws/metadata/DynamoDbMetadataStore.java +++ b/src/main/java/org/springframework/integration/aws/metadata/DynamoDbMetadataStore.java @@ -141,71 +141,74 @@ public class DynamoDbMetadataStore implements ConcurrentMetadataStore, Initializ @Override public void afterPropertiesSet() { try { - this.table.describe(); - updateTimeToLiveIfAny(); - this.createTableLatch.countDown(); - return; - } - catch (ResourceNotFoundException e) { - if (logger.isInfoEnabled()) { - logger.info("No table '" + this.table.getTableName() + "'. Creating one..."); + try { + this.table.describe(); + updateTimeToLiveIfAny(); + this.createTableLatch.countDown(); + return; } + catch (ResourceNotFoundException e) { + if (logger.isInfoEnabled()) { + logger.info("No table '" + this.table.getTableName() + "'. Creating one..."); + } + } + + CreateTableRequest createTableRequest = + new CreateTableRequest() + .withTableName(this.table.getTableName()) + .withKeySchema(new KeySchemaElement(KEY, KeyType.HASH)) + .withAttributeDefinitions(new AttributeDefinition(KEY, ScalarAttributeType.S)) + .withProvisionedThroughput(new ProvisionedThroughput(this.readCapacity, this.writeCapacity)); + + + this.dynamoDB.createTableAsync(createTableRequest, + new AsyncHandler() { + + @Override + public void onError(Exception e) { + logger.error("Cannot create DynamoDb table: " + + DynamoDbMetadataStore.this.table.getTableName(), e); + DynamoDbMetadataStore.this.createTableLatch.countDown(); + } + + @Override + public void onSuccess(CreateTableRequest request, CreateTableResult createTableResult) { + Waiter waiter = + DynamoDbMetadataStore.this.dynamoDB.waiters() + .tableExists(); + + WaiterParameters waiterParameters = + new WaiterParameters<>( + new DescribeTableRequest(DynamoDbMetadataStore.this.table.getTableName())) + .withPollingStrategy( + new PollingStrategy( + new MaxAttemptsRetryStrategy(DynamoDbMetadataStore.this.createTableRetries), + new FixedDelayStrategy(DynamoDbMetadataStore.this.createTableDelay))); + + waiter.runAsync(waiterParameters, new WaiterHandler() { + + @Override + public void onWaitSuccess(DescribeTableRequest request) { + updateTimeToLiveIfAny(); + DynamoDbMetadataStore.this.createTableLatch.countDown(); + DynamoDbMetadataStore.this.table.describe(); + } + + @Override + public void onWaitFailure(Exception e) { + logger.error("Cannot describe DynamoDb table: " + + DynamoDbMetadataStore.this.table.getTableName(), e); + DynamoDbMetadataStore.this.createTableLatch.countDown(); + } + + }); + } + + }); + } + finally { + this.initialized = true; } - - CreateTableRequest createTableRequest = - new CreateTableRequest() - .withTableName(this.table.getTableName()) - .withKeySchema(new KeySchemaElement(KEY, KeyType.HASH)) - .withAttributeDefinitions(new AttributeDefinition(KEY, ScalarAttributeType.S)) - .withProvisionedThroughput(new ProvisionedThroughput(this.readCapacity, this.writeCapacity)); - - - this.dynamoDB.createTableAsync(createTableRequest, - new AsyncHandler() { - - @Override - public void onError(Exception e) { - logger.error("Cannot create DynamoDb table: " + - DynamoDbMetadataStore.this.table.getTableName(), e); - DynamoDbMetadataStore.this.createTableLatch.countDown(); - } - - @Override - public void onSuccess(CreateTableRequest request, CreateTableResult createTableResult) { - Waiter waiter = - DynamoDbMetadataStore.this.dynamoDB.waiters() - .tableExists(); - - WaiterParameters waiterParameters = - new WaiterParameters<>( - new DescribeTableRequest(DynamoDbMetadataStore.this.table.getTableName())) - .withPollingStrategy( - new PollingStrategy( - new MaxAttemptsRetryStrategy(DynamoDbMetadataStore.this.createTableRetries), - new FixedDelayStrategy(DynamoDbMetadataStore.this.createTableDelay))); - - waiter.runAsync(waiterParameters, new WaiterHandler() { - - @Override - public void onWaitSuccess(DescribeTableRequest request) { - updateTimeToLiveIfAny(); - DynamoDbMetadataStore.this.createTableLatch.countDown(); - DynamoDbMetadataStore.this.table.describe(); - } - - @Override - public void onWaitFailure(Exception e) { - logger.error("Cannot describe DynamoDb table: " + - DynamoDbMetadataStore.this.table.getTableName(), e); - DynamoDbMetadataStore.this.createTableLatch.countDown(); - } - - }); - } - - }); - - this.initialized = true; } private void updateTimeToLiveIfAny() {