Amazon SQS (Simple Queue Service) is a fully managed message queuing service that enables decoupled and scalable microservice communication. Integrating SQS with Spring Boot becomes seamless using Spring Cloud AWS, which provides auto-configuration and abstraction for AWS services.
Prerequisites
- A basic Spring Boot project (Java 17+ recommended)
- An AWS account with SQS access
- An SQS Queue created (standard or FIFO)
- Maven or Gradle build tool
1. Add Required Dependencies
Add the following to your pom.xml
:
<dependencies>
<dependency>
<groupId>io.awspring.cloud</groupId>
<artifactId>spring-cloud-starter-aws-messaging</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.awspring.cloud</groupId>
<artifactId>spring-cloud-aws-dependencies</artifactId>
<version>3.0.2</version> <!-- Check for latest version -->
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2. Configure AWS Credentials
Use application.yml
or application.properties
:
cloud:
aws:
region:
static: us-east-1
credentials:
access-key: YOUR_AWS_ACCESS_KEY
secret-key: YOUR_AWS_SECRET_KEY
sqs:
enabled: true
Or use IAM roles if deploying on AWS infrastructure (preferred for production).
3. Send Messages to SQS
MessageSenderService.java
package com.example.sqs.service;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Service;
import org.springframework.cloud.aws.messaging.core.QueueMessagingTemplate;
@Service
@RequiredArgsConstructor
public class MessageSenderService {
private final QueueMessagingTemplate queueMessagingTemplate;
@Value("${cloud.aws.sqs.queue-name}")
private String queueName;
public void send(String message) {
queueMessagingTemplate.send(queueName, MessageBuilder.withPayload(message).build());
}
}
4. Receive Messages from SQS
MessageListener.java
package com.example.sqs.listener;
import org.springframework.cloud.aws.messaging.listener.annotation.SqsListener;
import org.springframework.stereotype.Component;
@Component
public class MessageListener {
@SqsListener("${cloud.aws.sqs.queue-name}")
public void receiveMessage(String message) {
System.out.println("Message received from SQS: " + message);
}
}
5. Controller to Trigger Send
SqsController.java
package com.example.sqs.controller;
import com.example.sqs.service.MessageSenderService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/sqs")
@RequiredArgsConstructor
public class SqsController {
private final MessageSenderService senderService;
@PostMapping("/send")
public String send(@RequestBody String message) {
senderService.send(message);
return "Message sent to SQS!";
}
}
6. Sample application.yml
server:
port: 8080
cloud:
aws:
region:
static: us-east-1
credentials:
access-key: YOUR_AWS_ACCESS_KEY
secret-key: YOUR_AWS_SECRET_KEY
sqs:
queue-name: your-queue-name
Optional: Use LocalStack for Local Testing
Add dependency:
<dependency>
<groupId>cloud.localstack</groupId>
<artifactId>localstack-utils</artifactId>
<version>0.2.10</version>
</dependency>
Spin up a local SQS using Docker:
docker run -d -p 4566:4566 localstack/localstack
Then adjust application.yml
to use localhost:4566
.
Summary
With Spring Cloud AWS:
- You can send and receive SQS messages using Spring-native patterns.
- No need to manually poll or manage the queue lifecycle.
- Great for building event-driven or asynchronous microservices.