Spring Boot,Spring Cloud AWS和AWS SQS无法从队列中读取
我正在尝试使用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()); } }
src / main / resources中的application.yaml:
cloud: aws: credentials: accessKey: ********************** secretKey: ********************** region: static: us-west-2
应用程序在启动时会抛出exception(但您可以在日志调试模式下看到exception!):
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] oscePropertySourcesPropertyResolver : Searching for key 'cloud.aws.credentials.accessKey' in [systemProperties] 2016-05-19 11:15:14.546 DEBUG 11704 --- [ main] oscePropertySourcesPropertyResolver : Searching for key 'cloud.aws.credentials.accessKey' in [systemEnvironment] 2016-05-19 11:15:14.546 DEBUG 11704 --- [ main] oscePropertySourcesPropertyResolver : Searching for key 'cloud.aws.credentials.accessKey' in [random] 2016-05-19 11:15:14.546 DEBUG 11704 --- [ main] oscePropertySourcesPropertyResolver : Searching for key 'cloud.aws.credentials.accessKey' in [applicationConfigurationProperties] 2016-05-19 11:15:14.546 DEBUG 11704 --- [ main] oscePropertySourcesPropertyResolver : Found key 'cloud.aws.credentials.accessKey' in [applicationConfigurationProperties] with type [String] and value '***' 2016-05-19 11:15:14.546 DEBUG 11704 --- [ main] oscePropertySourcesPropertyResolver : Searching for key 'cloud.aws.credentials.secretKey' in [systemProperties] 2016-05-19 11:15:14.546 DEBUG 11704 --- [ main] oscePropertySourcesPropertyResolver : Searching for key 'cloud.aws.credentials.secretKey' in [systemEnvironment] 2016-05-19 11:15:14.546 DEBUG 11704 --- [ main] oscePropertySourcesPropertyResolver : Searching for key 'cloud.aws.credentials.secretKey' in [random] 2016-05-19 11:15:14.546 DEBUG 11704 --- [ main] oscePropertySourcesPropertyResolver : Searching for key 'cloud.aws.credentials.secretKey' in [applicationConfigurationProperties] 2016-05-19 11:15:14.546 DEBUG 11704 --- [ main] oscePropertySourcesPropertyResolver : Found key 'cloud.aws.credentials.secretKey' in [applicationConfigurationProperties] with type [String] and value '***'
所以我不确定为什么它在寻找其他地方?
它也抛出了这个exception(如果你正在记录调试模式,它总是可见的):
java.lang.ClassNotFoundException: org.springframework.data.web.config.EnableSpringDataWebSupport
所以我不得不在build.gradle中添加
compile("org.springframework.data:spring-data-commons:1.12.1.RELEASE")
但是现在exception不再存在,但程序开始和结束时没有做任何事情,而且它不再打印日志了!
其他一些事实:
- Application.java在正确的包中让组件扫描工作,所以Spring应该看到QueueListener类,
- application.yaml被正确读取,如果一个错误的区域抱怨,
- 如果我输入错误的凭证(错误的accessKey或/和错误的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类,因为它没有Service / Component注释,因此:
@Service public class SqsQueueSender { ... }
解决了这个问题。
- 在Java SDK Amazon S3中配置路径样式
- AWS Managed ElasticSearch上的弹性传输客户端
- 使用ResourceNotFoundException的简单DynamoDB请求失败
- 如何在AWS中创建新用户
- Zookeeper错误:无法在选举地址打开通道X.
- com.amazonaws.services.s3.model.AmazonS3Exception:Forbidden(Service:Amazon S3; Status Code:403; Error Code:403 Forbidden; Request ID:XXXXXXXX)
- 将Maven依赖项部署到S3:没有可用的连接器
- 如何在另一个AWS Java Lambda函数中调用aws java lambda函数,两者都在同一个帐户中,同一个区域
- AWS Polly Java客户端提供错误:无法从链中的任何提供程序加载区域信息