Error while connecting to AWS SQS from spring boot

11,272

Solution 1

Fixed it, apparently issue was related to dependency mix up as mentioned here

Solution 2

I was facing the same issue as described. My solution requeried implement some extra methods for the Config class:

imports [...]

@Configuration
@RefreshScope
public class SpringCloudSQSConfig {

@Value("${cloud.aws.credentials.accessKeyId:default}")
private String accessKeyId;

@Value("${cloud.aws.credentials.secretKey:default}")
private String secretKey;

@Value("${cloud.aws.region.static:default}")
private String region;

private Logger logger = LoggerFactory.getLogger(this.getClass());

@Bean
public QueueMessagingTemplate queueMessagingTemplate() {
    return new QueueMessagingTemplate(amazonSQSAsync());
}

public AmazonSQSAsync amazonSQSAsync() {
    return AmazonSQSAsyncClientBuilder.standard().withRegion(Regions.US_EAST_2)
            .withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKeyId, secretKey)))
            .build();
}

@Bean
public SimpleMessageListenerContainerFactory simpleMessageListenerContainerFactory() {
    SimpleMessageListenerContainerFactory msgListenerContainerFactory = new SimpleMessageListenerContainerFactory();
    msgListenerContainerFactory.setAmazonSqs(amazonSQSAsync());
    return msgListenerContainerFactory;
}

@Bean
public QueueMessageHandler queueMessageHandler() {
    QueueMessageHandlerFactory queueMsgHandlerFactory = new QueueMessageHandlerFactory();
    queueMsgHandlerFactory.setAmazonSqs(amazonSQSAsync());
    QueueMessageHandler queueMessageHandler = queueMsgHandlerFactory.createQueueMessageHandler();
    List<HandlerMethodArgumentResolver> list = new ArrayList<>();
    HandlerMethodArgumentResolver resolver = new PayloadArgumentResolver(new MappingJackson2MessageConverter());
    list.add(resolver);
    queueMessageHandler.setArgumentResolvers(list);
    return queueMessageHandler;
}
}

And for the dependencies implemented:

        <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-aws</artifactId>
        <version>2.2.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-aws-messaging</artifactId>
        <version>2.2.1.RELEASE</version>
    </dependency>

and adding the next property in the properties file:

spring.main.allow-bean-definition-overriding=true

Share:
11,272
Bhargav
Author by

Bhargav

I am one in the millions who come here looking for answers :)

Updated on June 04, 2022

Comments

  • Bhargav
    Bhargav almost 2 years

    I am trying to integrate AWS SQS into my springboot app using spring cloud AWS, but keep getting this error(posted below), can someone help?

    Here are my files.

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'simpleMessageListenerContainer' defined in class path resource [org/springframework/cloud/aws/messaging/config/annotation/SqsConfiguration.class]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: com.amazonaws.http.ExecutionContext.setCredentials(Lcom/amazonaws/auth/AWSCredentials;)V

    @Configuration
    public class AWSConfig {
        @Value("${amazon.dynamodb.endpoint}")
        private String amazonDynamoDBEndpoint;
    
        @Value("${amazon.aws.accesskey}")
        private String amazonAWSAccessKey;
    
        @Value("${amazon.aws.secretkey}")
        private String amazonAWSSecretKey;
    
        @Value("${amazon.sqs.endpoint}")
        private String amazonSqsEndpoint;
        @Bean
        @Primary
        public AmazonSQSAsyncClient amazonSQSAsyncClient() {
    
            AmazonSQSAsyncClient amazonSQSAsyncClient = new AmazonSQSAsyncClient(amazonAWSCredentials());
            if (!StringUtils.isEmpty(amazonSqsEndpoint)) {
                amazonSQSAsyncClient.setEndpoint(amazonSqsEndpoint);
            }
    
            return amazonSQSAsyncClient;
    
        }
    
        @Bean
        public AWSCredentials amazonAWSCredentials() {
            return new BasicAWSCredentials(amazonAWSAccessKey, amazonAWSSecretKey);
        }
    }
    

    I am able to work with dynamodb with this but not able to connect to SQS. I have given the correct access key, secret access key and end point in application.properties file.

    @Component
        @EnableSqs
        public class SQSDao {
            private static final Logger logger = LoggerFactory.getLogger(SQSDao.class);
    
            private  QueueMessagingTemplate queueMessagingTemplate;
    
            @Autowired
            public SQSDao(AmazonSQSAsync amazonSqs) {
                this.queueMessagingTemplate = new QueueMessagingTemplate(amazonSqs);
            }
    
            public void send(String message) {
                System.out.println(queueMessagingTemplate.getDefaultDestination());
                queueMessagingTemplate.convertAndSend("test-queue",  MessageBuilder.withPayload(message).build());
            }
    
            @SqsListener(value = "test-queue", deletionPolicy = SqsMessageDeletionPolicy.NEVER)
            public void receive(String message)
            {
                System.out.println("message: " + message);
            }
    
        }