Guia completo para implementar comunicação em tempo real usando Jakarta WebSocket API
WebSockets permitem comunicação bidirecional e persistente entre servidor e cliente. Diferente do HTTP tradicional, que funciona no modelo request/response, o WebSocket mantém uma conexão aberta permitindo troca de dados em tempo real — ideal para chats, notificações, dashboards e sistemas colaborativos.
Adicione no seu pom.xml a API de WebSocket:
<dependency>
<groupId>jakarta.websocket</groupId>
<artifactId>jakarta.websocket-api</artifactId>
<version>2.1.0</version>
<scope>provided</scope>
</dependency>
Servidores compatíveis incluem:
O WebSocket é criado usando a anotação @ServerEndpoint, que define um endereço onde
os clientes irão se conectar.
import jakarta.websocket.*;
import jakarta.websocket.server.ServerEndpoint;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@ServerEndpoint("/ws/chat")
public class ChatEndpoint {
private static final Set<Session> sessions = ConcurrentHashMap.newKeySet();
@OnOpen
public void onOpen(Session session) {
sessions.add(session);
System.out.println("Cliente conectado: " + session.getId());
}
@OnMessage
public void onMessage(String message, Session sender) {
System.out.println("Mensagem recebida: " + message);
broadcast(message);
}
@OnClose
public void onClose(Session session) {
sessions.remove(session);
System.out.println("Cliente desconectado: " + session.getId());
}
@OnError
public void onError(Session session, Throwable error) {
error.printStackTrace();
}
private void broadcast(String message) {
sessions.forEach(s -> {
try {
s.getBasicRemote().sendText(message);
} catch (Exception e) {
e.printStackTrace();
}
});
}
}
src/
└── main/java/com/meuprojeto/
├── websocket/
│ └── ChatEndpoint.java
├── model/
│ └── Message.java
└── util/
└── JsonUtils.java
Você pode testar usando um cliente WebSocket como:
URL de teste:
ws://localhost:8080/seuapp/ws/chat
{
"sender": "João",
"text": "Olá, mundo!"
}
---
private void sendPrivate(String message, String targetId) {
sessions.stream()
.filter(s -> s.getId().equals(targetId))
.findFirst()
.ifPresent(s -> {
try {
s.getBasicRemote().sendText(message);
} catch (Exception e) {
e.printStackTrace();
}
});
}
Faça deploy em qualquer servidor compatível com Jakarta WebSocket, como Tomcat 10+.
Basta gerar o WAR e colocar em /webapps.