Spring Boot, Spring Cloud AWS and AWS SQS not reading from the queue

匿名 (未验证) 提交于 2019-12-03 09:02:45

问题:

I am trying a to build a minimal gradle java project with Spring Boot and Spring Cloud AWS SQS but I can't get it to read from the queue.

These are my project files:

build.gradle:

apply plugin: "java" apply plugin: "eclipse" apply plugin: "spring-boot" apply plugin: "io.spring.dependency-management"  sourceCompatibility = 1.8 targetCompatibility = 1.8  buildscript {     repositories {         mavenCentral()     }     dependencies {         classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.5.RELEASE")         classpath("io.spring.gradle:dependency-management-plugin:0.5.2.RELEASE")     } }  dependencyManagement {      imports {           mavenBom("org.springframework.cloud:spring-cloud-aws:1.1.0.RELEASE")      } }  repositories {     mavenCentral() }  dependencies {     compile("org.springframework.boot:spring-boot-starter-actuator:1.3.5.RELEASE")     compile("org.springframework.cloud:spring-cloud-starter-aws:1.1.0.RELEASE")     // if I don't add the line below, the annotation @MessageMapping is not found :(     // I would have expected that cloud-starter-aws would have taken care of it     compile("org.springframework.cloud:spring-cloud-aws-messaging:1.1.0.RELEASE")     // this has been added to fix an exception happening, please read below     compile("org.springframework.data:spring-data-commons:1.12.1.RELEASE") } 

Application.java:

package com.test;  import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;  @SpringBootApplication public class Application {         public static void main(String[] args)     {         SpringApplication.run(Application.class, args);     } } 

QueueListener.java:

package com.test.sqs;  import java.util.logging.Logger; import org.springframework.messaging.handler.annotation.MessageMapping; import com.test.sqs.model.TestMessage;  public class QueueListener {     @MessageMapping("test_queue")     private void receiveMessage(TestMessage testMessage)     {         System.out.println("Test message received: " + testMessage.getMessage());     } } 

application.yaml in src/main/resources:

cloud:     aws:         credentials:             accessKey: **********************             secretKey: **********************         region:             static: us-west-2 

The application throws an exception when starting (but you can see the exception just in log debug mode!):

org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.amazonaws.auth.profile.ProfilesConfigFile]: Constructor threw exception; nested exception is java.lang.IllegalArgumentException: AWS credential profiles file not found in the given path: C:\src\collector\default 

but always in the log I can see it did pick up my credentials from the yaml file:

2016-05-19 11:15:14.546 DEBUG 11704 --- [           main] o.s.c.e.PropertySourcesPropertyResolver  : Searching for key 'cloud.aws.credentials.accessKey' in [systemProperties] 2016-05-19 11:15:14.546 DEBUG 11704 --- [           main] o.s.c.e.PropertySourcesPropertyResolver  : Searching for key 'cloud.aws.credentials.accessKey' in [systemEnvironment] 2016-05-19 11:15:14.546 DEBUG 11704 --- [           main] o.s.c.e.PropertySourcesPropertyResolver  : Searching for key 'cloud.aws.credentials.accessKey' in [random] 2016-05-19 11:15:14.546 DEBUG 11704 --- [           main] o.s.c.e.PropertySourcesPropertyResolver  : Searching for key 'cloud.aws.credentials.accessKey' in [applicationConfigurationProperties] 2016-05-19 11:15:14.546 DEBUG 11704 --- [           main] o.s.c.e.PropertySourcesPropertyResolver  : Found key 'cloud.aws.credentials.accessKey' in [applicationConfigurationProperties] with type [String] and value '***' 2016-05-19 11:15:14.546 DEBUG 11704 --- [           main] o.s.c.e.PropertySourcesPropertyResolver  : Searching for key 'cloud.aws.credentials.secretKey' in [systemProperties] 2016-05-19 11:15:14.546 DEBUG 11704 --- [           main] o.s.c.e.PropertySourcesPropertyResolver  : Searching for key 'cloud.aws.credentials.secretKey' in [systemEnvironment] 2016-05-19 11:15:14.546 DEBUG 11704 --- [           main] o.s.c.e.PropertySourcesPropertyResolver  : Searching for key 'cloud.aws.credentials.secretKey' in [random] 2016-05-19 11:15:14.546 DEBUG 11704 --- [           main] o.s.c.e.PropertySourcesPropertyResolver  : Searching for key 'cloud.aws.credentials.secretKey' in [applicationConfigurationProperties] 2016-05-19 11:15:14.546 DEBUG 11704 --- [           main] o.s.c.e.PropertySourcesPropertyResolver  : Found key 'cloud.aws.credentials.secretKey' in [applicationConfigurationProperties] with type [String] and value '***' 

So I am not sure why it is looking somewhere else?

Also it's throwing this exception (always visible just if you are in logging debug mode):

    java.lang.ClassNotFoundException: org.springframework.data.web.config.EnableSpringDataWebSupport 

So I had to add in build.gradle

compile("org.springframework.data:spring-data-commons:1.12.1.RELEASE") 

But now the exception is not there anymore but the program starts and ends without doing anything, and it's not printing logs anymore!

Some other facts:

  • the Application.java is in the right package to let the component scan to work, so Spring should see the QueueListener class,
  • the application.yaml is read correctly, if a put a wrong region it complains,
  • if I put wrong credentials (wrong accessKey or/and wrong secretKey) it does not complain, so I don't think it is trying to connect to AWS at all.

I am not sure if line 34 of build.gradle:

compile("org.springframework.cloud:spring-cloud-starter-aws:1.1.0.RELEASE") // if I don't add the line below, the annotation @MessageMapping is not found :( // I would have expected that cloud-starter-aws would have taken care of it compile("org.springframework.cloud:spring-cloud-aws-messaging:1.1.0.RELEASE") // this has been added to fix an exception happening, please read below compile("org.springframework.data:spring-data-commons:1.12.1.RELEASE") 

could be a symptom of the issue, I would expect for all the needed libraries to be loaded by the cloud-starter-aws automatically.

What am I missing? Thank you!

回答1:

Found the issue, and it was something stupid of course.

Spring was not loading the QueueListener class because it didn't have the Service / Component annotation, so:

@Service public class SqsQueueSender { ... } 

fixed the issue.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!