Amazon Simple Notification Service (SNS) with Spring Boot
SNS เป็น Pub/Sub message ที่มีบริการอยู่บน AWS นะครับ วันนี้เราจะมาทดลองใช้งาน SNS กับ Spring Boot กัน อันดับแรก ไป create topic บน SNS กันเลยครับ
เรามาสร้าง Topic : sns-spring-boot-test-topic
ต่อไปก็ถึงเวลาที่เราจะสร้าง Service จาก Spring Boot เพื่อ Publish and Subscribe กันแล้วครับ
เพิ่ม dependencies ไปดังนี้นะครับ
<?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>2.5.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>spring-boot-sns</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-boot-sns</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-sns</artifactId>
<version>1.11.541</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-sts</artifactId>
<version>1.11.541</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<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>
เพื่อ configuration file เพื่อสร้าง SNS Client ครับ
package com.example.springbootsns.configuration;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.sns.AmazonSNSClient;
import com.amazonaws.services.sns.AmazonSNSClientBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
@Configuration
public class SNSConfiguration {
@Primary
@Bean
public AmazonSNSClient amazonSNSClient() {
return (AmazonSNSClient) AmazonSNSClientBuilder.standard().withRegion(Regions.AP_SOUTHEAST_1)
.withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials("xxxxx", "xxxxx)))
.build();
}
}
ขอสงวน key ไว้นะครับ
เราจะมา subscribe กันด้วย email นะครับสำหรับตัวอย่างนี้ สร้าง Rest Controller กันเลยครับ
package com.example.springbootsns.controller;
import com.amazonaws.services.sns.AmazonSNSClient;
import com.amazonaws.services.sns.model.PublishRequest;
import com.amazonaws.services.sns.model.SubscribeRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class SNSController {
private static String TOPIC_ARN = "arn:aws:sns:ap-southeast-1:083572612527:sns-spring-boot-test-topic";
@Autowired
private AmazonSNSClient amazonSNSClient;
@GetMapping("/subscribe/{email}")
public String subscribe(@PathVariable("email") String email) {
SubscribeRequest subscribeRequest = new SubscribeRequest(TOPIC_ARN, "email", email);
amazonSNSClient.subscribe(subscribeRequest);
return "Please check your email";
}
@GetMapping("/publish/{message}")
public String publish(@PathVariable("message") String message) {
PublishRequest publishRequest = new PublishRequest(TOPIC_ARN, "Test from Spring boot", message);
amazonSNSClient.publish(publishRequest);
return "Plush done!!";
}
}
เพิ่ม configuration ใน application.yml นิดหน่อยครับ
cloud:
aws:
region:
static: ap-southeast-1
auto: false
stack:
auto: false
รัน application กันครับ
subscribe กัน
ไปเช็ค email
ต่อไปมา publish message กันครับ
ไปเช็ค email ครับ
เป็นไงครับ ง่าย จิมๆ