WebSocket em Java: aplicações avançadas em tempo real

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

WebSocket em Java: criando aplicações real-time de nível avançado



Aplicações web modernas cada vez mais exigem transferência instantânea de dados entre cliente e servidor. O HTTP tradicional, baseado em requisições-respostas, é ineficiente para tarefas onde a latência é crítica: chats online, cotações de bolsa, edição colaborativa de documentos ou servidores de jogos. O protocolo WebSocket resolve esse problema estabelecendo uma conexão bidirecional permanente. Neste artigo, exploraremos técnicas avançadas de trabalho com WebSocket em Java, indo além dos exemplos básicos.



1. Arquitetura de uma aplicação WebSocket avançada em Java



O exemplo básico de WebSocket em Java usando a anotação @ServerEndpoint é bom para aprendizado, mas para soluções em produção é necessária uma arquitetura mais robusta. Vamos considerar os componentes-chave.



1.1. Escolha da stack de tecnologias

Para aplicações enterprise, o padrão de facto é o Spring Boot com o módulo spring-boot-starter-websocket. Ele fornece integração com STOMP (Simple Text Oriented Messaging Protocol) — um subprotocolo sobre WebSocket que adiciona roteamento de mensagens, filas e inscrições.



1.2. Configuração básica do WebSocket no Spring Boot

Vamos começar com a classe de configuração:



@Configuration@EnableWebSocketMessageBrokerpublic class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

@Override public void configureMessageBroker(MessageBrokerRegistry config) { // Broker embutido para filas /topic e /queue config.enableSimpleBroker("/topic", "/queue"); // Prefixo para mensagens do cliente para o servidor config.setApplicationDestinationPrefixes("/app"); // Prefixo para filas de usuário (ponto-a-ponto) config.setUserDestinationPrefix("/user"); }

@Override public void registerStompEndpoints(StompEndpointRegistry registry) { // Endpoint para conexão via SockJS (fallback para navegadores antigos) registry.addEndpoint("/ws") .setAllowedOrigins("*") .withSockJS(); }}


Este código configura os pontos de conexão, prefixos para roteamento e um broker de mensagens embutido. O uso de STOMP simplifica significativamente o trabalho com inscrições e filas.



2. Processamento avançado de mensagens: do chat aos dados de bolsa



Agora vamos para a implementação de cenários específicos. Consideraremos três casos típicos: chat em grupo, notificações pessoais e streaming de dados.



2.1. Chat em grupo com histórico de mensagens

Um chat simples é um broadcast de mensagens em um tópico. Vamos complicar a tarefa: adicionar salvamento de histórico e filtragem por salas.



@Controllerpublic class ChatController {

@Autowired private ChatMessageRepository repository; // Repositório JPA

@MessageMapping("/chat.sendMessage") @SendTo("/topic/chat/{roomId}") public ChatMessage sendMessage(@Payload ChatMessage message, @DestinationVariable String roomId, SimpMessageHeaderAccessor headerAccessor) { // Salva no banco de dados message.setTimestamp(Instant.now()); repository.save(message); // Adiciona informações do remetente da sessão String username = (String) headerAccessor.getSessionAttributes().get("username"); message.setSender(username); return message; }

@MessageMapping("/chat.addUser") @SendTo("/topic/chat/{roomId}") public ChatMessage addUser(@Payload ChatMessage message, @DestinationVariable String roomId, SimpMessageHeaderAccessor headerAccessor) { headerAccessor.getSessionAttributes().put("username", message.getSender()); return message; }}


Aqui usamos

Blogs

Book Recommendations