I am trying to migrate one of my microservice from Spring Boot 2.7.x to Spring Boot 3.2.x.
Currently I am planning to use:
- Spring Boot: 3.2.5
- Spring Cloud AWS: 3.1.1
- Java: 21
Included dependencies in my gradle file
implementation 'io.awspring.cloud:spring-cloud-aws-starter'
implementation 'io.awspring.cloud:spring-cloud-aws-starter-sqs'
and I have few listeners in my service for which I am using @SqsListener
@SqsListener(value = "${custom.queue}", acknowledgementMode = ON_SUCCESS)
public void queuelistener(String requestPayload) {
try {
processData(requestPayload);
} catch (Exception e) {
log.error("Exception occured in request", e.getMessage());
}
}
One of the listener is for a FIFO queue and remaining listeners are for Standard Queues.
When I am trying to start my application I am getting an error that “SqsMessageListenerContainer must contain either all FIFO or all Standard queues”
org.springframework.context.ApplicationContextException: Failed to start bean 'io.awspring.cloud.messaging.internalEndpointRegistryBeanName'
at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:291)
at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:471)
at java.base/java.lang.Iterable.forEach(Iterable.java:75)
at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:260)
at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:205)
at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:981)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:334)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1354)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1343)
at com.rubix.crawler.CrawlerServiceApplication.main(CrawlerServiceApplication.java:12)
Caused by: java.util.concurrent.CompletionException: java.lang.IllegalArgumentException: SqsMessageListenerContainer must contain either all FIFO or all Standard queues.
at java.base/java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:315)
at java.base/java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:320)
at java.base/java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1807)
at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: java.lang.IllegalArgumentException: SqsMessageListenerContainer must contain either all FIFO or all Standard queues.
at org.springframework.util.Assert.isTrue(Assert.java:111)
at io.awspring.cloud.sqs.listener.SqsMessageListenerContainer.createDefaultComponentFactories(SqsMessageListenerContainer.java:125)
at io.awspring.cloud.sqs.listener.AbstractPipelineMessageListenerContainer.getComponentFactories(AbstractPipelineMessageListenerContainer.java:110)
at io.awspring.cloud.sqs.listener.AbstractPipelineMessageListenerContainer.determineComponentFactory(AbstractPipelineMessageListenerContainer.java:100)
at io.awspring.cloud.sqs.listener.AbstractPipelineMessageListenerContainer.doStart(AbstractPipelineMessageListenerContainer.java:91)
at io.awspring.cloud.sqs.listener.AbstractMessageListenerContainer.start(AbstractMessageListenerContainer.java:287)
at io.awspring.cloud.sqs.LifecycleHandler.lambda$manageLifecycle$4(LifecycleHandler.java:76)
at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:1024)
at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762)
at io.awspring.cloud.sqs.LifecycleHandler.manageLifecycle(LifecycleHandler.java:74)
at io.awspring.cloud.sqs.LifecycleHandler.lambda$manageLifecycle$0(LifecycleHandler.java:81)
at java.base/java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1804)
... 1 common frames omitted
Earlier it used to work fine but why now they have added this check.
Is there anyway to configure SqsMessageListenerContainer to have listeners for both types of queues.
Thanks in advance.