Spring Cloud AWS - Prise en charge de la messagerie

Spring Cloud AWS - Prise en charge de la messagerie

Dans le dernier article, nous passons à AWS Messaging Support.

1. Prise en charge de la messagerie AWS

1.1. SQS (service de file d'attente simple)

Nous pouvons envoyer des messages à une file d'attente SQS en utilisant lesQueueMessagingTemplate.

Pour créer ce bean, nous pouvons utiliser un clientAmazonSQSAsync qui est disponible par défaut dans le contexte de l'application lors de l'utilisation de démarreurs Spring Boot:

@Bean
public QueueMessagingTemplate queueMessagingTemplate(
  AmazonSQSAsync amazonSQSAsync) {
    return new QueueMessagingTemplate(amazonSQSAsync);
}

Ensuite, nous pouvons envoyer les messages en utilisant la méthodeconvertAndSend():

@Autowired
QueueMessagingTemplate messagingTemplate;

public void send(String topicName, Object message) {
    messagingTemplate.convertAndSend(topicName, message);
}

Étant donné qu'Amazon SQS n'accepte que les charges utiles deString, les objets Java sont automatiquement sérialisés en JSON.

Nous pouvons également configurer les écouteurs en utilisant@SqsListener:

@SqsListener("spring-cloud-test-queue")
public void receiveMessage(String message,
  @Header("SenderId") String senderId) {
    // ...
}

Cette méthode recevra les messages despring-cloud-test-queue puis les traitera. Nous pouvons également récupérer les en-têtes de message en utilisant l'annotation@Header sur les paramètres de méthode.

Si le premier paramètre est un objet Java personnalisé au lieu deString, Spring convertira le message dans ce type à l'aide de la conversion JSON.

1.2. SNS (service de notification simple)

Semblable à SQS, nous pouvons utiliserNotificationMessagingTemplate pour publier des messages dans un sujet.

Pour le créer, nous avons besoin d'un clientAmazonSNS:

@Bean
public NotificationMessagingTemplate notificationMessagingTemplate(
  AmazonSNS amazonSNS) {
    return new NotificationMessagingTemplate(amazonSNS);
}

Ensuite, nous pouvons envoyer des notifications au sujet:

@Autowired
NotificationMessagingTemplate messagingTemplate;

public void send(String Object message, String subject) {
    messagingTemplate
      .sendNotification("spring-cloud-test-topic", message, subject);
}

Parmi les multiples points de terminaison SNS pris en charge par AWS - SQS, HTTP (S), e-mail et SMS,the project only supports HTTP(S).

Nous pouvons configurer les points de terminaison dans un contrôleur 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. Ce contrôleur active un point de terminaison HTTP (s) -/topic-subscriber qui sera utilisé par une rubrique SNS pour créer un abonnement.

Par exemple, nous pouvons nous abonner à un sujet en appelant l’URL:

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

L'en-tête de la demande détermine laquelle des trois méthodes est appelée.

La méthode avec l'annotation@NotificationSubscriptionMapping est appelée lorsque l'en-tête[x-amz-sns-message-type=SubscriptionConfirmation] est présent et confirme un nouvel abonnement à une rubrique.

Une fois abonné, le sujet enverra des notifications au point de terminaison avec l'en-tête[x-amz-sns-message-type=Notification]. Cela invoquera la méthode annotée avec@NotificationMessageMapping.

Enfin, lorsque le point de terminaison se désabonne de la rubrique, une demande de confirmation est reçue avec l'en-tête[x-amz-sns-message-type=UnsubscribeConfirmation].

Cela appelle la méthode annotée avec@NotificationUnsubscribeConfirmationMapping qui confirme l'action de désabonnement.

Veuillez noter que la valeur en@RequestMapping n'a rien à voir avec le nom du sujet auquel il est abonné.

2. Conclusion

Dans ce dernier article, nous avons exploré la prise en charge de Spring Cloud pour AWS Messaging - qui conclut cette série rapide sur Spring Cloud et AWS.

Comme d'habitude, les exemples sont disponiblesover on GitHub.