Los Servlets asíncronos liberan el hilo del pool de Tomcat mientras se espera una operación larga (BD, servicio externo), mejorando la escalabilidad:
@WebServlet(urlPatterns = "/datos-lentos", asyncSupported = true)
public class AsyncServlet extends HttpServlet {
private final ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor(); // Java 21
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
AsyncContext ctx = req.startAsync();
ctx.setTimeout(30_000); // 30 segundos de timeout
executor.submit(() -> {
try {
// Operación lenta (BD, API externa...)
Thread.sleep(2000);
String resultado = obtenerDatos();
HttpServletResponse r = (HttpServletResponse) ctx.getResponse();
r.setContentType("application/json");
r.getWriter().println("{\"datos\": \"" + resultado + "\"}");
ctx.complete();
} catch (Exception e) {
ctx.complete();
}
});
}
private String obtenerDatos() { return "ejemplo"; }
}
