Skip to main content

Spring Boot Message to SNS

Description

Spring-Boot-Message-to-SNS-01.png

In this example we will publish messages to an SNS topic from a Spring Boot application.

Prerequisites

Run LocalStack

version: '3.8'

services:
localstack:
image: localstack/localstack
container_name: localstack_main
ports:
- "4566-4599:4566-4599"
environment:
- SERVICES=sns,s3,sqs,dynamodb,ses,lambda,logs,stepfunctions
- DYNAMODB_SHARE_DB=1
- DEBUG=1
- DATA_DIR=/tmp/localstack/data
- DOCKER_HOST=unix:///var/run/docker.sock
volumes:
- "${LOCALSTACK_VOLUME_DIR:-./volume}:/var/lib/localstack"
- "/var/run/docker.sock:/var/run/docker.sock"

Create Topic

awslocal sns create-topic --name localstack-topic
{
"TopicArn": "arn:aws:sns:us-east-1:000000000000:localstack-topic"
}

Create Spring Boot

.
├── mvnw
├── pom.xml
├── README.md
└── src
├── main
│   ├── java
│   │   └── com
│   │   └── jreact
│   │   └── sns
│   │   ├── PersonRequest.java
│   │   ├── SNSAppConfig.java
│   │   └── SNSApp.java
│   └── resources
│   └── application.properties
└── test
└── java
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

<groupId>com.jreact</groupId>
<artifactId>spring-boot-message-to-sns</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-boot-message-to-sns</name>
<description>spring-boot-message-to-sns</description>

<properties>
<java.version>21</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-aws-messaging</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>bom</artifactId>
<version>2.20.47</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>

</project>
  • application.properties

sns.topic.arn=arn:aws:sns:us-east-1:000000000000:localstack-topic
  • SNSApp.java

package com.jreact.sns;

import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.sns.AmazonSNS;
import com.amazonaws.services.sns.AmazonSNSClientBuilder;
import com.amazonaws.services.sns.model.PublishResult;
import com.google.gson.Gson;
import lombok.RequiredArgsConstructor;
import lombok.extern.java.Log;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;

@Log
@SpringBootApplication
@RequiredArgsConstructor
public class SNSApp implements ApplicationRunner {
private final AmazonSNS amazonSNS = AmazonSNSClientBuilder.standard()
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration("http://localhost:4566", "us-east-1"))
.build();

@Value("${sns.topic.arn}")
private String snsTopicARN;

public static void main(String[] args) throws ParseException {
SpringApplication.run(SNSApp.class, args);
}

@Override
public void run(ApplicationArguments args) throws Exception {
List<PersonRequest> personRequests = new ArrayList<>();

PersonRequest personRequest = new PersonRequest();
personRequest.setFirstName("John");
personRequest.setLastName("Doe");
personRequest.setAge(26);
personRequest.setAddress("Address01");
personRequests.add(personRequest);

personRequest = new PersonRequest();
personRequest.setFirstName("Jack");
personRequest.setLastName("Smith");
personRequest.setAge(30);
personRequest.setAddress("Address02");
personRequests.add(personRequest);

for (PersonRequest personRequest2 : personRequests) {
publishSNSMessage(new Gson().toJson(personRequest2));
}
}

public void publishSNSMessage(String message) {
log.info("snsTopicARN: " + snsTopicARN);

log.info("Publishing SNS message: " + message);
PublishResult result = this.amazonSNS.publish(this.snsTopicARN, message);
log.info("SNS Message ID: " + result.getMessageId());
}
}
  • PersonRequest.java

package com.jreact.sns;


public class PersonRequest {

private int id;
private String firstName;
private String lastName;
private int age;
private String address;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getFirstName() {
return firstName;
}

public void setFirstName(String firstName) {
this.firstName = firstName;
}

public String getLastName() {
return lastName;
}

public void setLastName(String lastName) {
this.lastName = lastName;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public String getAddress() {
return address;
}

public void setAddress(String address) {
this.address = address;
}
}

Running

mvn clean install
mvn spring-boot:run

Output

...
...
2024-10-05T19:53:54.008+02:00 INFO 207422 --- [ main] com.jreact.sns.SNSApp : Started SNSApp in 0.557 seconds (process running for 0.683)
2024-10-05T19:53:54.012+02:00 INFO 207422 --- [ main] com.jreact.sns.SNSApp : snsTopicARN: arn:aws:sns:us-east-1:000000000000:localstack-topic
2024-10-05T19:53:54.012+02:00 INFO 207422 --- [ main] com.jreact.sns.SNSApp : Publishing SNS message: {"id":0,"firstName":"John","lastName":"Doe","age":26,"address":"Address01"}
2024-10-05T19:53:54.121+02:00 INFO 207422 --- [ main] com.jreact.sns.SNSApp : SNS Message ID: c64ae2c5-0e50-4c9c-b027-913b8835d70a
2024-10-05T19:53:54.121+02:00 INFO 207422 --- [ main] com.jreact.sns.SNSApp : snsTopicARN: arn:aws:sns:us-east-1:000000000000:localstack-topic
2024-10-05T19:53:54.121+02:00 INFO 207422 --- [ main] com.jreact.sns.SNSApp : Publishing SNS message: {"id":0,"firstName":"Jack","lastName":"Smith","age":30,"address":"Address02"}
2024-10-05T19:53:54.125+02:00 INFO 207422 --- [ main] com.jreact.sns.SNSApp : SNS Message ID: f7039652-e7f9-4301-a0d1-cea8430cb686