«В последней статье мы переходим к поддержке обмена сообщениями AWS.
1. Поддержка обмена сообщениями AWS
1.1. SQS (Простая служба очереди)
Мы можем отправлять сообщения в очередь SQS, используя шаблон QueueMessagingTemplate.
Для создания этого 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);
}
Из нескольких конечных точек 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.