Um painel (dashboard) de clima em tempo real construído com Spring Boot e WebSockets. O sistema busca periodicamente os dados climáticos de uma lista de cidades (no estado de Goiás) e atualiza os clientes conectados instantaneamente, sem a necessidade de recarregar a página.
- Backend: Java 21, Spring Boot, Spring WebSockets (STOMP), RestTemplate.
- Frontend: HTML, CSS, JavaScript (Vanilla), SockJS, Stomp.js.
- API Externa: wttr.in para obter os dados climáticos reais em formato JSON.
- Java 21 instalado em sua máquina.
- Porta 8080 livre.
- Abra um terminal na pasta raiz do projeto (
api-clima-real-websockets). - Execute o projeto usando o Gradle Wrapper embutido:
- No Linux/macOS:
./gradlew bootRun
- No Windows:
gradlew.bat bootRun
- No Linux/macOS:
- Aguarde o Spring Boot baixar as dependências e iniciar o servidor na porta padrão
8080. - Abra o seu navegador e acesse a página do Dashboard:
- Clique no botão Conectar para que o Dashboard inicie a conexão com o servidor e comece a receber os cards climáticos das cidades.
- (Opcional) Clique em Parar para desconectar; o servidor detectará que não há clientes conectados e interromperá as requisições à API externa para economizar recursos.
O projeto utiliza o padrão Pub/Sub (Publish/Subscribe) por meio do protocolo STOMP rodando sobre WebSockets, facilitado pelo SockJS.
- Conexão:
- Quando você clica em "Conectar", o frontend (via JavaScript) inicia uma conexão WebSocket com o servidor no endpoint configurado:
/ws-clima. - O
ClimaSchedulerno servidor possui um ouvinte (@EventListener) que detecta a nova conexão e incrementa o número de clientes ativos.
- Quando você clica em "Conectar", o frontend (via JavaScript) inicia uma conexão WebSocket com o servidor no endpoint configurado:
- Inscrição (Subscribe):
- O cliente se inscreve no tópico
/topic/climapara começar a escutar as transmissões que o servidor enviar para este "canal".
- O cliente se inscreve no tópico
- Busca e Processamento (Scheduler):
- O
ClimaScheduleré acionado automaticamente a cada 5 segundos. - Primeiro, ele verifica se existe alguém conectado. Se a contagem for 0, ele encerra a execução silenciosamente.
- Caso haja clientes, ele obtém uma cidade não repetida do
CidadeRepository. - Em seguida, chama o
ClimaService, que utiliza oRestTemplatepara fazer uma requisição REST (HTTP GET) na API públicawttr.ine mapeia a resposta para a temperatura em Celsius e a descrição do clima.
- O
- Envio (Publish):
- Os dados são empacotados em um objeto
ClimaDTO, que também adiciona a hora local da requisição. - O
SimpMessagingTemplateconverte este objeto em JSON e faz o disparo (broadcast) para a rota/topic/clima.
- Os dados são empacotados em um objeto
- Recepção e Exibição:
- Todos os navegadores conectados e inscritos recebem o JSON em tempo real.
- A função JavaScript recebe os dados e cria um novo card visual na tela. A cor do card muda dinamicamente dependendo do nível de temperatura (frio, ameno ou quente).




