最後の記事では、AWSメッセージングサポートに移ります。

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

1.1. SQS(Simple Queue Service)

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

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

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

AmazonSQSは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)、メール、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アノテーションにトピック名を追加する必要があります。このコントローラーは、SNSトピックで使用されるHTTP(s)エンドポイント– /topic-subscriberを有効にしますサブスクリプションを作成します。

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

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

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

@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から入手できます。