Перейти к основному содержимому

Spring Cloud AWS — поддержка обмена сообщениями

· 3 мин. чтения

Задача: Сумма двух чисел

Напишите функцию twoSum. Которая получает массив целых чисел nums и целую сумму target, а возвращает индексы двух чисел, сумма которых равна target. Любой набор входных данных имеет ровно одно решение, и вы не можете использовать один и тот же элемент дважды. Ответ можно возвращать в любом порядке...

ANDROMEDA

В последней статье мы переходим к поддержке обмена сообщениями AWS.

1. Поддержка обмена сообщениями AWS

1.1. SQS (Простая служба очереди)

Мы можем отправлять сообщения в очередь SQS, используя QueueMessagingTemplate .

Чтобы создать этот компонент, мы можем использовать клиент 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);
}

Из нескольких конечных точек SNS, поддерживаемых AWS — 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 (s) — /topic-subscriber , которая используется темой SNS для создания подписки.

Например, мы можем подписаться на тему, вызвав URL:

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

Заголовок в запросе определяет, какой из трех методов вызывается.

Метод с аннотацией @NotificationSubscriptionMapping вызывается при наличии заголовка [x-amz-sns-message-type=SubscriptionConfirmation] и подтверждает новую подписку на тему.

После подписки тема будет отправлять уведомления на конечную точку с заголовком [x-amz-sns-message-type=Notification] . Это вызовет метод с аннотацией @NotificationMessageMapping .

Наконец, когда конечная точка отменяет подписку на тему, приходит запрос подтверждения с заголовком [x-amz-sns-message-type=UnsubscribeConfirmation] .

Это вызывает метод, аннотированный @NotificationUnsubscribeConfirmationMapping , который подтверждает действие отказа от подписки.

Обратите внимание, что значение в @RequestMapping не имеет ничего общего с названием темы, на которую он подписан.

2. Заключение

В этой заключительной статье мы рассмотрели поддержку Spring Cloud для обмена сообщениями AWS, которая завершает эту краткую серию статей о Spring Cloud и AWS.

Как обычно, примеры доступны на GitHub .