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

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

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

1. Поддержка AWS Messaging

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,the project only supports 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();
    }
}

We need to add the topic name to the @RequestMapping annotation on the controller level. Этот контроллер включает конечную точку 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.

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