在最終文章中,我們將深入探討 AWS 消息支持。
• Spring Cloud AWS – EC2
• Spring Cloud AWS – RDS
1. AWS 消息支持
1.1. SQS(簡單隊列服務)
我們可以使用 QueueMessagingTemplate 發送消息到 SQS 隊列。
要創建此 Bean,可以使用默認情況下在應用程序上下文中可用的 AmazonSQSAsync 客户端:當使用 Spring Boot 啓動器時。
@Bean
public QueueMessagingTemplate queueMessagingTemplate(
AmazonSQSAsync amazonSQSAsync) {
return new QueueMessagingTemplate(amazonSQSAsync);
}然後,我們可以使用 convertAndSend() 方法發送消息:
@Autowired
QueueMessagingTemplate messagingTemplate;
public void send(String topicName, Object message) {
messagingTemplate.convertAndSend(topicName, message);
}由於 Amazon SQS 僅接受 String 類型的負載,Java 對象會自動序列化為 JSON。
我們還可以使用 @SqsListener 配置監聽器:
@SqsListener("spring-cloud-test-queue")
public void receiveMessage(String message,
@Header("SenderId") String senderId) {
// ...
}此方法將接收來自 spring-cloud-test-queue 的消息,然後處理這些消息。 此外,我們還可以使用在方法參數上對 @Header 註解進行標註的方式,來檢索消息頭信息。
如果第一個參數是自定義的 Java 對象而不是 String,Spring 將使用 JSON 轉換將消息轉換為該類型。
1.2. SNS(簡單通知服務)
類似於 SQS,我們可以使用 NotificationMessagingTemplate 將消息發佈到主題。
要創建它,我們需要一個 AmazonSNS 客户端:
@Bean
public NotificationMessagingTemplate notificationMessagingTemplate(
AmazonSNS amazonSNS) {
return new NotificationMessagingTemplate(amazonSNS);
}然後,我們可以向主題發送通知:
@Autowired
NotificationMessagingTemplate messagingTemplate;
public void send(String Object message, String subject) {
messagingTemplate
.sendNotification("spring-cloud-test-topic", message, subject);
}從 AWS 支持的多個 SNS 端點中,包括 SQS、HTTP(S)、電子郵件和短信,該項目僅支持 HTTP(S)。
我們可以配置端點在 MVC 控制器中:
@Controller
@RequestMapping("/topic-subscriber")
public class SNSEndpointController {
@NotificationSubscriptionMapping
public void confirmUnsubscribeMessage(
NotificationStatus notificationStatus) {
notificationStatus.confirmSubscription();
}
@NotificationMessageMapping
public void receiveNotification(@NotificationMessage String message,
@NotificationSubject String subject) {
// handle message
}
@NotificationUnsubscribeConfirmationMapping
public void confirmSubscriptionMessage(
NotificationStatus notificationStatus) {
notificationStatus.confirmSubscription();
}
}我們需要在控制器級別的@RequestMapping註解中添加主題名稱。該控制器啓用一個 HTTP(s) 端點——/topic-subscriber,用於由 SNS 主題創建訂閲。
例如,我們可以通過調用 URL 訂閲主題:
https://host:port/topic-subscriber/請求頭中的標示符決定將調用哪一種方法。
當請求頭中包含且值為 @NotificationSubscriptionMapping 註解時,將調用該方法,以確認對主題的新訂閲。
訂閲成功後,主題將向具有請求頭 @RequestMapping 的端點發送通知。這將調用帶有 @NotificationMessageMapping 註解的方法。
最後,當端點取消訂閲主題時,將收到帶有請求頭 @RequestMapping 的確認請求,以確認取消訂閲操作。
請注意,@RequestMapping 中的值與訂閲的主題名稱無關。
2. 結論
在本文中,我們探討了 Spring Cloud 對 AWS 消息服務的支持,這標誌着關於 Spring Cloud 和 AWS 的快速系列文章的結束。