Spring Cloud AWS - メッセージングのサポート

Spring Cloud AWS –メッセージングのサポート

最後の記事では、AWS Messaging Supportに進みます。

1. AWSメッセージングサポート

1.1. SQS(Simple Queue Service)

QueueMessagingTemplateを使用してSQSキューにメッセージを送信できます。

このBeanを作成するには、Spring Bootスターターを使用するときにアプリケーションコンテキストでデフォルトで使用できるAmazonSQSAsyncクライアントを使用できます。

@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アノテーションを使用してメッセージヘッダーを取得することもできます。

最初のパラメータがString,ではなくカスタムJavaオブジェクトの場合、SpringはJSON変換を使用してメッセージをそのタイプに変換します。

1.2. SNS(Simple Notification Service)

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);
}

AWSでサポートされている複数のSNSエンドポイントのうち、SQS、HTTP(S)、Eメールおよび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.このコントローラーは、SNSトピックがサブスクリプションを作成するために使用するHTTP(s)エンドポイント–/topic-subscriberを有効にします。

たとえば、URLを呼び出すことでトピックをサブスクライブできます。

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

リクエストのヘッダーは、3つのメソッドのどれが呼び出されるかを決定します。

ヘッダー[x-amz-sns-message-type=SubscriptionConfirmation]が存在し、トピックへの新しいサブスクリプションを確認すると、@NotificationSubscriptionMappingアノテーション付きのメソッドが呼び出されます。

サブスクライブされると、トピックはヘッダー[x-amz-sns-message-type=Notification]を使用してエンドポイントに通知を送信します。 これにより、@NotificationMessageMappingアノテーションが付けられたメソッドが呼び出されます。

最後に、エンドポイントがトピックのサブスクライブを解除すると、ヘッダー[x-amz-sns-message-type=UnsubscribeConfirmation]を含む確認要求が受信されます。

これにより、@NotificationUnsubscribeConfirmationMappingアノテーションが付けられたメソッドが呼び出され、サブスクライブ解除アクションが確認されます。

@RequestMappingの値は、サブスクライブしているトピック名とは関係がないことに注意してください。

2. 結論

この最後の記事では、SpringCloudによるAWSメッセージングのサポートについて説明しました。これでSpringCloudとAWSに関するこの簡単なシリーズは終わりです。

いつものように、例は利用可能なover on GitHubです。