Spring Cloud AWS –消息支持

在最後一篇文章中,我們將繼續介紹AWS Messaging支持。

1. AWS Messaging支持

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),電子郵件和SMS,該項目僅支持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端點- /topic-subscriber ,SNS主題可使用該端點創建預訂。

例如,我們可以通過調用URL來訂閱主題:

https://host:port/topic-subscriber/

請求中的標頭確定了調用這三種方法中的哪一種。

當標頭[x-amz-sns-message-type=SubscriptionConfirmation]存在並確認對主題的新訂閱時,將調用帶有@NotificationSubscriptionMapping批註的方法。

訂閱後,主題將使用標頭[x-amz-sns-message-type=Notification]將通知發送到端點。這將調用以@NotificationMessageMapping註釋的方法。

最後,當端點取消訂閱該主題時,會收到帶有標頭[x-amz-sns-message-type=UnsubscribeConfirmation]的確認請求。

這將調用以@NotificationUnsubscribeConfirmationMapping註釋的方法,該方法確認取消訂閱操作。

請注意,@ @RequestMapping中的值與其預訂的主題名稱無關。

2.結論

在最後一篇文章中,我們探討了Spring Cloud對AWS Messaging的支持-總結了有關Spring Cloud和AWS的快速系列。

和往常一樣,這些示例可以在GitHub上找到