Рубрики
Без рубрики

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

Краткое введение в поддержку Spring Cloud для обмена сообщениями AWS.

Автор оригинала: baeldung.

В заключительной статье мы перейдем к поддержке обмена сообщениями 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 .