Spring Cloud AWS - Suporte a Mensagens

Spring Cloud AWS - Suporte a Mensagens

No artigo final, passamos ao Suporte da AWS Messaging.

1. Suporte de mensagens da AWS

1.1. SQS (Simple Queue Service)

Podemos enviar mensagens para uma fila SQS usandoQueueMessagingTemplate.

Para criar este bean, podemos usar um clienteAmazonSQSAsync que está disponível por padrão no contexto do aplicativo ao usar iniciadores Spring Boot:

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

Então, podemos enviar as mensagens usando o métodoconvertAndSend():

@Autowired
QueueMessagingTemplate messagingTemplate;

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

Como o Amazon SQS aceita apenas cargas úteisString, os objetos Java são serializados automaticamente para JSON.

Também podemos configurar ouvintes usando@SqsListener:

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

Este método receberá mensagens despring-cloud-test-queue e as processará. Também podemos recuperar cabeçalhos de mensagens usando a anotação@Header nos parâmetros do método.

Se o primeiro parâmetro for um objeto Java personalizado em vez deString,, o Spring converterá a mensagem para esse tipo usando a conversão JSON.

1.2. SNS (Serviço de Notificação Simples)

Semelhante ao SQS, podemos usarNotificationMessagingTemplate para publicar mensagens em um tópico.

Para criá-lo, precisamos de um clienteAmazonSNS:

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

Em seguida, podemos enviar notificações para o tópico:

@Autowired
NotificationMessagingTemplate messagingTemplate;

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

Dos vários endpoints SNS suportados pelo AWS - SQS, HTTP (S), e-mail e SMS,the project only supports HTTP(S).

Podemos configurar os pontos de extremidade em um controlador 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. Este controlador ativa um ponto de extremidade HTTP (s) -/topic-subscriber que pode ser usado por um tópico SNS para criar uma assinatura.

Por exemplo, podemos assinar um tópico chamando o URL:

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

O cabeçalho da solicitação determina qual dos três métodos é invocado.

O método com a anotação@NotificationSubscriptionMapping é invocado quando o cabeçalho[x-amz-sns-message-type=SubscriptionConfirmation] está presente e confirma uma nova inscrição em um tópico.

Uma vez inscrito, o tópico enviará notificações ao endpoint com o cabeçalho[x-amz-sns-message-type=Notification]. Isso invocará o método anotado com@NotificationMessageMapping.

Finalmente, quando o endpoint cancela a assinatura do tópico, uma solicitação de confirmação é recebida com o cabeçalho[x-amz-sns-message-type=UnsubscribeConfirmation].

Isso chama o método anotado com@NotificationUnsubscribeConfirmationMapping que confirma a ação de cancelamento.

Observe que o valor em@RequestMapping não tem nada a ver com o nome do tópico ao qual está inscrito.

2. Conclusão

Neste artigo final, exploramos o suporte do Spring Cloud para AWS Messaging - que conclui esta série rápida sobre Spring Cloud e AWS.

Como de costume, os exemplos estão disponíveisover on GitHub.