Skip to the content.

Spring Boot listener for AWS SQS with Spring Cloud

I was surprised how little code I needed to get a Spring Boot application listening to an Amazon SQS queue.

I put a gist on Github to illustrate.

The key is that when you have the right dependencies in your Maven POM, all you have to do is annotate your listener method with @SqsListener:

public void listen(DataObject message) {"!!!! received message {} {}", message.getFoo(), message.getBar());

The dependency on spring-cloud-starter-aws takes care of initializing everything and scanning for annotated methods.

Command line arguments and authentication

You specify AWS credentials and region through Spring Boot properties. I passed these as command line arguments through Eclipse, where I was debugging locally / not on AWS:

  • set my region to US East 1 (Northern VA).
  • tells Spring Boot to use the AWS DefaultAWSCredentialsChain, which will pull credentials from either environment vars or ~/.aws/credentials file.
  • I also set environment variable AWS_PROFILE for the default credentials chain to find my credentials under the correct profile.

If I were running in AWS itself, the EC2 instance metadata could have determined the region automatically, and also provided credentials via the instance profile.

Testing via AWS console

I used the AWS console to send test messages. The main gotcha is that if you are using JSON messages and using Spring to automatically deserialize JSON to your objects via @JsonProperty annotations, you will need to specify the message attribute (header) contentType with value application/json. Otherwise the conversion will fail with an unhelpful error message like “Cannot convert from [java.lang.String] to …. for GenericMessage ….” with no indication why there was a failure.

There is another alternative for reconfiguring the default Spring messaging classes to ignore the contentType header.