Spring Cloud AWS kinesis stream binder не удалось запустить из-за неправильной инициализации bean-компонента

Я пытаюсь запустить этого простого потребителя сообщений кинезиса с помощью следующего кода. Это единственный класс в приложении

Я столкнулся с этой ошибкой, так как я обновил последнюю версию снимка программы kinesis binder.

    @SpringBootApplication
    @RestController
    @EnableBinding(Sink.class)
    @EnableAutoConfiguration
    public class ProducerApplication {



      public static void main(String[] args) {
        SpringApplication.run(ProducerApplication.class, args);
      }

      @StreamListener(Sink.INPUT)
      public void listen(String message) {
        System.out.println("Message has been received"+message);
      }

    }

Приложение yml

server.port: 8081


spring:
  cloud:
    stream:
      bindings:
        input:
          destination: my.sink
          content-type: application/json




cloud:
  aws:
    region:
      static: us-east-1
    credentials:
      accessKey: <accessKey>
      secretKey: <secretKey>

build.gradle

     buildscript {
        ext {
            springBootVersion = '2.0.3.RELEASE'
        }
        repositories {
            mavenCentral()
            maven { url "https://repo.spring.io/snapshot" }
            maven { url "https://repo.spring.io/milestone" }
        }
        dependencies {
            classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        }
    }

    apply plugin: 'java'
    apply plugin: 'eclipse'
    apply plugin: 'org.springframework.boot'
    apply plugin: 'io.spring.dependency-management'

    group = 'com.kinesis.demo'
    version = '0.0.1-SNAPSHOT'
    sourceCompatibility = 1.8

    repositories {
        mavenCentral()
        maven { url "https://repo.spring.io/snapshot" }
        maven { url "https://repo.spring.io/milestone" }
    }


    dependencies {
        compile('org.springframework.boot:spring-boot-starter')
        compile('org.springframework.boot:spring-boot-starter-web')
        compile('org.springframework.boot:spring-boot-starter-actuator')
        compile('org.springframework.cloud:spring-cloud-stream-binder-kinesis:1.0.0.BUILD-SNAPSHOT')
        testCompile('org.springframework.boot:spring-boot-starter-test')
    }

Я получаю исключение инициализации bean-компонента, и, похоже, возникла проблема с созданием bean-компонента DynamoDbMetadataStore.

2018-07-10 10:53:22.629  INFO 18332 --- [esis-consumer-1] a.i.k.KinesisMessageDrivenChannelAdapter : Got an exception java.lang.IllegalStateException: The component has not been initialized: DynamoDbMetadataStore{table={SpringIntegrationMetadataStore: {AttributeDefinitions: [{AttributeName: KEY,AttributeType: S}],TableName: SpringIntegrationMetadataStore,KeySchema: [{AttributeName: KEY,KeyType: HASH}],TableStatus: ACTIVE,CreationDateTime: Wed Jun 27 10:51:53 IST 2018,ProvisionedThroughput: {NumberOfDecreasesToday: 0,ReadCapacityUnits: 1,WriteCapacityUnits: 1},TableSizeBytes: 0,ItemCount: 0,TableArn: arn:aws:dynamodb:us-east-1:1234567:table/SpringIntegrationMetadataStore,TableId: d0cf588b-e122-406b-ad82-06255dfea6d4,}}, createTableRetries=25, createTableDelay=1, readCapacity=1, writeCapacity=1, timeToLive=null}.
 Is it declared as a bean? during [ShardConsumer{shardOffset=KinesisShardOffset{iteratorType=LATEST, sequenceNumber='null', timestamp=null, stream='my.sink', shard='shardId-000000000000', reset=false}, state=NEW}] task invocation.
Process will be retried on the next iteration.

Эта ошибка возникла после обновления до последней версии моментального снимка программы привязки kinesis.

Не могли бы вы проверить, что-то не так.


comment
Можете ли вы просто поделиться с нами простым проектом где-нибудь на Git Hub? Также я не знаю о свойстве конфигурации cloud.aws.kinesis.endpoint. Что это? Кто и как им пользуется?   -  person Artem Bilan    schedule 10.07.2018
comment
@ArtemBilan Спасибо, что изучили это. Я добавил сюда образец проекта github.com/patan12/spring-kinesis-poc Можно пожалуйста, проверьте и помогите   -  person Patan    schedule 10.07.2018
comment
Это свойство не имеет значения cloud.aws.kinesis.endpoint. Я удалил   -  person Patan    schedule 10.07.2018


Ответы (1)


Я только что исправил проблему: https://github.com/spring-projects/spring-integration-aws/commit/fc34f814e557936d1bcb815d0879bd4f6e035675

Проблема заключалась в том, что когда у нас уже есть таблица в DynamoDB, мы просто возвращаемся из afterPropertiesSet(), оставляя initialized как false.

Последняя BUILD-SNAPSHOT теперь должна работать.

person Artem Bilan    schedule 10.07.2018
comment
Спасибо. Теперь я получаю эту ошибку, это связано с проблемами доступа. casdAmazonDynamoDBLockClient: не удалось получить блокировку из-за сбоя на стороне клиента при разговоре с DDB com.amazonaws.services.dynamodbv2.model.AmazonDynamoDBException: пользователь: arn: aws: iam :: 123: пользователь / aws-kinesis-dev не авторизован выполнить: Dynamodb: GetItem на ресурсе: arn: aws: Dynamodb: us-east-1: 123: table / SpringIntegrationLockRegistry (Service: AmazonDynamoDBv2; Код состояния: 400; Код ошибки: AccessDeniedException; Идентификатор запроса: R5S2G137V3NN625GSOF52ASOHG4BVVA9) - person Patan; 10.07.2018
comment
User: arn:aws:iam::123:user/aws-kinesis-dev is not authorized to perform: dynamodb:GetItem on resource:. Это уже выходит за рамки ответственности проекта Spring Cloud Stream Kinesis Binder. Вам необходимо предоставить эти разрешения для использования GetItem. - person Artem Bilan; 10.07.2018
comment
После предоставления достаточного разрешения это сработало. Спасибо - person Patan; 12.07.2018