Spring 启动,Spring Cloud AWS 和 AWS SQS 未从队列中读取
Spring Boot, Spring Cloud AWS and AWS SQS not reading from the queue
我正在尝试使用 Spring Boot 和 Spring Cloud AWS SQS 构建一个最小的 gradle java 项目,但我无法从中读取它排队。
这些是我的项目文件:
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 在 src/main/resources:
cloud:
aws:
credentials:
accessKey: **********************
secretKey: **********************
region:
static: us-west-2
应用程序在启动时抛出异常(但您可以在日志调试模式下看到异常!):
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
但我总是在日志中看到它确实从 yaml 文件中获取了我的凭据:
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 '***'
所以我不确定为什么它在寻找其他地方?
它还会抛出此异常(只要您处于日志记录调试模式,它就会始终可见):
java.lang.ClassNotFoundException: org.springframework.data.web.config.EnableSpringDataWebSupport
所以我不得不添加 build.gradle
compile("org.springframework.data:spring-data-commons:1.12.1.RELEASE")
但是现在异常已经不存在了,但是程序启动和结束什么都不做,它不再打印日志了!
其他一些事实:
- Application.java 位于使组件扫描工作的正确包中,因此 Spring 应该看到 QueueListener class、
- application.yaml 读取正确,如果放错区域它会抱怨,
- 如果我输入了错误的凭据(错误的 accessKey or/and 错误的 secretKey)它不会抱怨,所以我认为它根本没有尝试连接到 AWS。
我不确定 build.gradle 的第 34 行是否:
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")
可能是问题的征兆,我希望所有需要的库都由 cloud-starter-aws 自动加载。
我错过了什么?谢谢!
找到了问题,当然是一些愚蠢的事情。
Spring 没有加载 QueueListener class 因为它没有服务/组件注释,所以:
@Service
public class SqsQueueSender
{
...
}
已解决问题。
我正在尝试使用 Spring Boot 和 Spring Cloud AWS SQS 构建一个最小的 gradle java 项目,但我无法从中读取它排队。
这些是我的项目文件:
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 在 src/main/resources:
cloud:
aws:
credentials:
accessKey: **********************
secretKey: **********************
region:
static: us-west-2
应用程序在启动时抛出异常(但您可以在日志调试模式下看到异常!):
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
但我总是在日志中看到它确实从 yaml 文件中获取了我的凭据:
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 '***'
所以我不确定为什么它在寻找其他地方?
它还会抛出此异常(只要您处于日志记录调试模式,它就会始终可见):
java.lang.ClassNotFoundException: org.springframework.data.web.config.EnableSpringDataWebSupport
所以我不得不添加 build.gradle
compile("org.springframework.data:spring-data-commons:1.12.1.RELEASE")
但是现在异常已经不存在了,但是程序启动和结束什么都不做,它不再打印日志了!
其他一些事实:
- Application.java 位于使组件扫描工作的正确包中,因此 Spring 应该看到 QueueListener class、
- application.yaml 读取正确,如果放错区域它会抱怨,
- 如果我输入了错误的凭据(错误的 accessKey or/and 错误的 secretKey)它不会抱怨,所以我认为它根本没有尝试连接到 AWS。
我不确定 build.gradle 的第 34 行是否:
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")
可能是问题的征兆,我希望所有需要的库都由 cloud-starter-aws 自动加载。
我错过了什么?谢谢!
找到了问题,当然是一些愚蠢的事情。
Spring 没有加载 QueueListener class 因为它没有服务/组件注释,所以:
@Service
public class SqsQueueSender
{
...
}
已解决问题。