Tutorial: Consumindo mensagens do AWS SQS com JMS em uma aplicação Spring Boot

Funcionamento do SQS

O que é AWS SQS:

O Simple Queue Service da AWS, ou apenas SQS, é um serviço gerenciado de filas da AWS, capaz de trafegar mensagens entre aplicações e serviços.

Com o SQS é possível enviar e receber mensagens de forma assíncrona e eficiente, sem a preocupação de armazenamento de eventos gerados e não lidos.

A fonte de informação de um SQS, ou seja quem pode publicar mensagens nele, pode ser uma aplicação em execução em um ECS, um Lambda ou um SNS. Nesse último caso, é possível criar uma inscrição entre o SQS e o SNS, de tal modo que a cada mensagem publicada no SNS seja automaticamente copiada para a fila.

Existem dois tipos de fila:

  • Standard: esse tipo possui uma capacidade de entrega de mensagens superior, com a garantia de entrega da mensagem de pelo menos uma vez e não garante a ordem entre as mensagens que foram publicadas;
  • FIFO: esse tipo de fila tem uma capacidade de entrega inferior, porém entrega cada mensagem somente um vez, garantindo a ordem em que foi publicada.

A escolha entre os dois tipos de fila deve levar em conta suas vantagens e desvantagens.

Esse artigo irá apresentar como consumir mensagens do AWS SQS, utilizando o Java Message Service — JMS, em uma aplicação construída com o Spring Boot.

O JMS é uma API que permite que aplicações em Java possam enviar e receber mensagens de um mecanismo de mensageria, como o SQS. Com o JMS é possível abstrair várias ações que devem ser feitas para consumir essas mensagens do SQS, como número de threads para ficarem lendo a fila e também o comportamento a ser feito quando uma mensagem nova chega nessa fila.

Configurando o Spring Boot com SQS:

O processo de configuração da aplicação Spring Boot para consumir mensagens do SQS com o JMS consiste em alguns passos, que serão descritos a seguir:

  • Incluir as bibliotecas do SQS e do JMS no arquivo build.gradle;
  • Adicionar variáveis de ambiente no arquivo application.properties;
  • Criar a classe de configuração para definir alguns comportamentos.

As bibliotecas que devem ser adicionadas ao projeto, no arquivo build.gradle , na seção dependencies , são apresentadas abaixo:

As duas primeiras fazem parte do SDK da AWS e são responsáveis, consecutivamente, por estabelecer o cliente do SQS e interagir com o JMS, que é adicionado ao projeto pela terceira biblioteca.

Em relação às variáveis de ambiente, é necessário adicionar a região em que a aplicação está em execução, assim como o nome das filas a serem consumidas por essa aplicação. Isso deve ser feito no arquivo application.properties, como pode ser visto a seguir:

Essas variáveis ainda serão utilizadas mais adiante, ainda nesse artigo.

O interessante é injetar o valor dessas variáveis durante a execução da aplicação. Se a aplicação estiver em execução em um ECS, isso pode ser feito na seção de variáveis de ambiente do container, dentro da definição da tarefa do serviço em execução no ECS.

Para configurar o JMS e o cliente do SQS, basta criar uma classe anotada com @Configuration e @EnableJms, como pode ser visto na classe a seguir

A primeira anotação fará com que o Spring Boot crie uma instância dessa classe assim que a aplicação entra em execução. A segunda anotação habilita o JMS na aplicação.

Perceba que a variável aws.region está sendo utilizada aqui. Ela será útil para configurar o cliente do SQS, como pode ser visto no método a seguir, que deve ser criado nessa mesma classe:

A primeira parte desse método configura o factory de conexões do cliente do SQS, em relação a região em que a aplicação está sendo executada, através da variável que foi injetada aqui, bem como onde localizar as credenciais de acesso aos recursos da AWS. Esse último dá acesso, explicando de forma simplória, ao papel que a aplicação assume ao ser executada na AWS.

A segunda parte desse método configura o JMS, que recebe o factory de conexões criado na primeira parte, assim como outras configurações.

Nessa parte de configurações do JMS, vale ressaltar o seguinte trecho:

factory.setConcurrency("2);

Essa instrução configura quantas threads por fila serão utilizados para consumir as mensagens dessa fila.

Consumindo as mensagens do SQS:

Agora que tudo já foi configurado para que a aplicação consuma mensagens do SQS, é hora de de fato, consumí-las. Isso pode ser feito criando uma classe anotada com @Service, como pode ser visto no trecho a seguir:

Aqui está sendo injetado o ObjectMapper, que pode ser útil para interpretar mensagens em formato JSON que chegam da fila.

Para consumir as mensagens da fila, dentro dessa classe é necessário criar um método anotado com @JmsListener, tendo como parâmetro destination o valor da fila a ser consumida, que nesse caso recebe o valor da segunda variável de ambiente:

Esse método deve receber um parâmetro do tipo TextMessage, que dentro outros atributos, possui o conteúdo da mensagem recebida em seu atributo text.

Se outras filas tiverem que ser consumidas pela mesma aplicação, basta adicionar um outro método anotado com @JmsListener.

Se você gostou desse conteúdo, siga-me no LinkedIn, para receber notificações de outros tutoriais como esse!

Conclusão:

Perceba como é simples configurar uma aplicação Spring Boot para consumir mensagens do SQS, que é um excelente recurso para estabelecer uma comunicação assíncrona entre microsserviços.

Se você gostou desse conteúdo, siga-me no LinkedIn, para receber notificações de outros tutoriais como esse!

Referência:

Esse artigo foi baseado nos conceitos ministrados nesse curso online: Curso criando microsserviços em Java com AWS ECS e Fargate

Quem sou eu:

  • Trabalhei diariamente com as tecnologias apresentadas nesse blog por quase 4 anos, atuando como desenvolvedor de soluções hospedadas na AWS;
  • Tenho lecionado disciplinas de cloud computing, principalmente AWS, em curso de pós-graduação há quase 10 anos;
  • Tenho livros publicados sobre o assunto;
  • Faço parte da comunidade global AWS Community Builder 2020/2021, criada pela própria AWS.