我正在使用AmazonSQS和Spring Boot(spring-cloud-aws-messaging).我已经配置了一个消息监听器来使用注释@SqsListener接收来自队列的消息.
@SqsListener(value = "indexerQueue", deletionPolicy = SqsMessageDeletionPolicy.ON_SUCCESS)
public void queueListener(String rawMessage) {
...
}
Run Code Online (Sandbox Code Playgroud)
这是一个非常简单的方法,但我没有找到从配置文件加载队列名称的方法,因为我有不同的环境.关于这方面的任何想法?
使用 Spring CloudHoxton.SR4和 Spring Boot2.2.9.RELEASE库,我的 Spring Boot 微服务可以正确启动,并且在本地环境中针对 localstack 运行时运行得很好,但是当我升级到 时Hoxton.SR7,我得到以下堆栈跟踪:
com.amazonaws.SdkClientException: Failed to connect to service endpoint:
at com.amazonaws.internal.EC2ResourceFetcher.doReadResource(EC2ResourceFetcher.java:100)
at com.amazonaws.internal.InstanceMetadataServiceResourceFetcher.getToken(InstanceMetadataServiceResourceFetcher.java:91)
at com.amazonaws.internal.InstanceMetadataServiceResourceFetcher.readResource(InstanceMetadataServiceResourceFetcher.java:69)
at com.amazonaws.internal.EC2ResourceFetcher.readResource(EC2ResourceFetcher.java:66)
at com.amazonaws.util.EC2MetadataUtils.getItems(EC2MetadataUtils.java:402)
at com.amazonaws.util.EC2MetadataUtils.getData(EC2MetadataUtils.java:371)
at org.springframework.cloud.aws.context.support.env.AwsCloudEnvironmentCheckUtils.isRunningOnCloudEnvironment(AwsCloudEnvironmentCheckUtils.java:38)
at org.springframework.cloud.aws.context.annotation.OnAwsCloudEnvironmentCondition.matches(OnAwsCloudEnvironmentCondition.java:38)
at org.springframework.context.annotation.ConditionEvaluator.shouldSkip(ConditionEvaluator.java:108)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader$TrackedConditionEvaluator.shouldSkip(ConfigurationClassBeanDefinitionReader.java:469)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:131)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:120)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:331)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:236)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:280)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:96)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:707)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:533)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215)
at com.acme.Bootstrapper.main(Bootstrapper.java:33)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at …Run Code Online (Sandbox Code Playgroud) 我能够弄清楚如何设置它的唯一方法是在我的配置中使用以下覆盖:
@Bean("myFactory")
@ConditionalOnClass(SqsAsyncClient.class)
SqsMessageListenerContainerFactory<Object> mySqsListenerContainerFactory(
SqsAsyncClient sqsAsyncClient) {
return SqsMessageListenerContainerFactory.builder()
.configure(
options ->
options.acknowledgementMode(
AcknowledgementMode.valueOf("ON_SUCCESS")))
.sqsAsyncClient(sqsAsyncClient)
.build();
}
Run Code Online (Sandbox Code Playgroud)
这在我的@SQSListener:
@SqsListener(
value = "myQueue",
factory = "myFactory")
Run Code Online (Sandbox Code Playgroud)
我还没有弄清楚如何配置它,以便io.awspring.cloud.autoconfigure.sqs.SqsAutoConfiguration类可以设置确认模式,并且我可以获得让 Spring 自动配置我需要的一切的好处。谁能告诉我应该如何继续发展?
在 Spring Cloud AWS 3.x 之前,我们设置如下@SQSListener,似乎不再支持:
@SqsListener(
value = "myQueue",
deletionPolicy = SqsMessageDeletionPolicy.ON_SUCCESS)
Run Code Online (Sandbox Code Playgroud) 我正在使用 spring-cloud-aws 向 SQS FIFO 队列发送消息。
它失败了
请求必须包含参数 MessageGroupId
spring-cloud-aws-messaging 中的 QueueMessagingTemplate 上似乎没有任何地方允许我设置此强制性 MessageGroupId。
目前是否有一种方法可以写入这个庄园中的 SQS FIFO 队列,或者我是否必须恢复到直接使用 amazons API?
我有一个标准的 SNS 主题,并且我\xc2\xb4ve 设置了“订阅过滤策略”,如下所示:
\n{\n "event": [\n "eventName"\n ]\n}\nRun Code Online (Sandbox Code Playgroud)\n当我使用属性消息通过 AWS 控制台发布消息时,该消息将发送至正确的 SQS 订阅者。所以订阅过滤器工作得很好。
\n现在我正在尝试对我的 java 代码(Spring Boot)执行相同的操作。
\n我正在使用该库spring-cloud-aws-messaging,据我所知它只是 AWS JDK 的包装器。
问题是我不知道如何设置消息属性,就像我在 AWS 控制台上所做的那样。
\n\xc2\xb4 与我发送到 SNS 的 JSON 格式无关,属性始终位于 SNS 消息的正文中。我想有一个特定的方法来设置这些属性。
\n我发现com.amazonaws.services.sns.model.MessageAttributeValue
我不确定是否是正确的类,而且我无法理解如何发布消息和属性,因为发布方法不接受它。
\nthis.amazonSNS.publish(this.snsTopicARN, message, messageAttributes ???);\nRun Code Online (Sandbox Code Playgroud)\n java amazon-web-services amazon-sns spring-cloud spring-cloud-aws
我正在开发一个Spring Batch应用程序,该应用程序应仅将AWS Cloud用于特定的配置文件。当前,我有一个使用aws的配置文件,另一个不应使用的配置文件,因为它使用本地数据库,本地文件等在本地运行应用程序(同时AWS配置文件将使用RDS,S3等)
对于使用AWS概要文件的配置,我具有以下内容:
@Configuration
@Profile("!localDev")
public class FileReaderConfigAWS {
@Value("${cloud.aws.s3.bucket}")
private String amazonS3Bucket;
@Autowired
private ResourceLoader resourceLoader;
private static final Logger logger = LoggerFactory.getLogger(FileReaderConfigAWS.class);
@Bean
@StepScope
public FlatFileItemReader<Object> flatFileReader(@Value("#{jobParameters['inputFile']}") String inputFile, LineMapper
lineMapper) {
FlatFileItemReader<Object> flatFileItemReader = new FlatFileItemReader<>();
flatFileItemReader.setResource(resourceLoader.getResource("s3://" + this.amazonS3Bucket + "/" + inputFile));
flatFileItemReader.setLineMapper(lineMapper);
return flatFileItemReader;
}
@Bean
public AbstractFileValidator inputFileValidator() {
InputS3Validator inputS3Validator = new InputS3Validator();
inputS3Validator.setRequiredKeys(new String[]{InputFileSystemValidator.INPUT_FILE});
return inputS3Validator;
}
}
Run Code Online (Sandbox Code Playgroud)
对于我的localDev配置文件,我具有以下内容:
@Profile("localDev")
@Configuration
public class FileReaderConfigLocalDev {
@Bean
@StepScope
public FlatFileItemReader<Object> flatFileReader(@Value("#{jobParameters['inputFile']}") String …Run Code Online (Sandbox Code Playgroud) 我目前正在开展一个项目,我们的应用程序需要在该项目中连接到 Amazon RDS 实例。到目前为止,我一直在使用以下文档进行设置:https : //cloud.spring.io/spring-cloud-aws/spring-cloud-aws.html#_sdk_credentials_configuration。
根据文档第 7.3 节,我应该将 application.properties 文件设置为:
cloud.aws.credentials.accessKey=XXXXXXXXXXXXXXX
cloud.aws.credentials.secretKey=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
cloud.aws.credentials.instanceProfile=true
cloud.aws.region.static=us-east-2
cloud.aws.rds.instanceNameTest
cloud.aws.rds.instanceNameTest.password=chownTestPW
cloud.aws.rds.instanceNameTest.username=dataTest1
cloud.aws.rds.instanceNameTest.databaseName=testDB
Run Code Online (Sandbox Code Playgroud)
但是,当我运行应用程序时,我收到以下错误:
Caused by: java.lang.IllegalArgumentException: Password must not be null
at org.springframework.util.Assert.notNull(Assert.java:193) ~[spring-core-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.cloud.aws.jdbc.datasource.DataSourceInformation.<init>(DataSourceInformation.java:65) ~[spring-cloud-aws-jdbc-2.0.0.RELEASE.jar:2.0.0.RELEASE]
at org.springframework.cloud.aws.jdbc.rds.AmazonRdsDataSourceFactoryBean.fromRdsInstance(AmazonRdsDataSourceFactoryBean.java:187) ~[spring-cloud-aws-jdbc-2.0.0.RELEASE.jar:2.0.0.RELEASE]
at org.springframework.cloud.aws.jdbc.rds.AmazonRdsDataSourceFactoryBean.createDataSourceInstance(AmazonRdsDataSourceFactoryBean.java:153) ~[spring-cloud-aws-jdbc-2.0.0.RELEASE.jar:2.0.0.RELEASE]
at org.springframework.cloud.aws.jdbc.rds.AmazonRdsDataSourceFactoryBean.createInstance(AmazonRdsDataSourceFactoryBean.java:130) ~[spring-cloud-aws-jdbc-2.0.0.RELEASE.jar:2.0.0.RELEASE]
at org.springframework.cloud.aws.jdbc.rds.AmazonRdsDataSourceFactoryBean.createInstance(AmazonRdsDataSourceFactoryBean.java:45) ~[spring-cloud-aws-jdbc-2.0.0.RELEASE.jar:2.0.0.RELEASE]
at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:141) ~[spring-beans-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1765) ~[spring-beans-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1702) ~[spring-beans-5.0.6.RELEASE.jar:5.0.6.RELEASE]
... 30 common frames omitted
Run Code Online (Sandbox Code Playgroud)
我不知道为什么当上面的设置看起来不错时,它告诉我密码为空。
任何的意见都将会有帮助。如果我需要提供其他任何东西,请告诉我。
谢谢。
spring-boot ×3
amazon-sqs ×2
java ×2
spring-cloud ×2
amazon-rds ×1
amazon-sns ×1
jdbc ×1
spring-batch ×1