В заключительной статье мы перейдем к поддержке обмена сообщениями AWS.
1. Поддержка обмена сообщениями AWS
1.1. SQS (Простая служба очередей)
Мы можем отправлять сообщения в очередь SQS с помощью QueueMessagingTemplate .
Для создания этого компонента мы можем использовать клиент AmazonSQSAsync , который по умолчанию доступен в контексте приложения при использовании Spring Boot starters:
@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.
Мы также можем настроить прослушиватели с помощью @Sqllistener :
@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 для публикации сообщений в теме.
Чтобы создать его, нам нужен клиент Amazon SNS :
@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) – /тему-подписчика , которая будет использоваться темой 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 .