Spring Cloud AWS - Messaging-Unterstützung

Spring Cloud AWS - Messaging-Unterstützung

Im letzten Artikel fahren wir mit dem AWS Messaging-Support fort.

1. AWS Messaging-Unterstützung

1.1. SQS (Simple Queue Service)

Wir können Nachrichten mitQueueMessagingTemplate an eine SQS-Warteschlange senden.

Um diese Bean zu erstellen, können wir einenAmazonSQSAsync-Client verwenden, der standardmäßig im Anwendungskontext verfügbar ist, wenn Spring Boot-Starter verwendet werden:

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

Dann können wir die Nachrichten mit der MethodeconvertAndSend() senden:

@Autowired
QueueMessagingTemplate messagingTemplate;

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

Da Amazon SQS nur die Nutzdaten vonStringakzeptiert, werden Java-Objekte automatisch in JSON serialisiert.

Wir können Listener auch mit@SqsListener konfigurieren:

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

Diese Methode empfängt Nachrichten vonspring-cloud-test-queue und verarbeitet sie dann. Wir können Nachrichtenkopfzeilen auch mithilfe der Annotation@Headerzu Methodenparametern abrufen.

Wenn der erste Parameter ein benutzerdefiniertes Java-Objekt anstelle vonString,ist, konvertiert Spring die Nachricht mithilfe der JSON-Konvertierung in diesen Typ.

1.2. SNS (Simple Notification Service)

Ähnlich wie bei SQS können wirNotificationMessagingTemplate verwenden, um Nachrichten zu einem Thema zu veröffentlichen.

Um es zu erstellen, benötigen wir einenAmazonSNS-Client:

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

Dann können wir Benachrichtigungen an das Thema senden:

@Autowired
NotificationMessagingTemplate messagingTemplate;

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

Von den mehreren von AWS unterstützten SNS-Endpunkten - SQS, HTTP (S), E-Mail und SMS -the project only supports HTTP(S).

Wir können die Endpunkte in einem MVC-Controller konfigurieren:

@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. Dieser Controller aktiviert einen HTTP (s) -Endpunkt -/topic-subscriber, der von einem SNS-Thema zum Erstellen eines Abonnements verwendet wird.

Zum Beispiel können wir ein Thema abonnieren, indem wir die URL aufrufen:

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

Der Header in der Anforderung bestimmt, welche der drei Methoden aufgerufen wird.

Die Methode mit der Annotation@NotificationSubscriptionMapping wird aufgerufen, wenn der Header[x-amz-sns-message-type=SubscriptionConfirmation] vorhanden ist, und bestätigt ein neues Abonnement für ein Thema.

Nach dem Abonnieren sendet das Thema Benachrichtigungen mit dem Header[x-amz-sns-message-type=Notification] an den Endpunkt. Dadurch wird die mit@NotificationMessageMapping annotierte Methode aufgerufen.

Wenn sich der Endpunkt vom Thema abmeldet, wird schließlich eine Bestätigungsanforderung mit dem Header[x-amz-sns-message-type=UnsubscribeConfirmation] empfangen.

Dies ruft die mit@NotificationUnsubscribeConfirmationMapping annotierte Methode auf, die die Aktion zum Abbestellen bestätigt.

Bitte beachten Sie, dass der Wert in@RequestMapping nichts mit dem Themennamen zu tun hat, den er abonniert hat.

2. Fazit

In diesem letzten Artikel haben wir uns mit der Unterstützung von Spring Cloud für AWS Messaging befasst. Damit ist diese kurze Serie über Spring Cloud und AWS abgeschlossen.

Wie üblich sind die Beispiele inover on GitHub verfügbar.