Оптимизация Java-cервлетов с помощью AsyncContext
Last updated: 10 мая 2025 г.Представим ситуацию, что сервлет ожидает завершения какого-то процесса выполняющегося в другом потоке, чтобы в последствии использовать результат его выполнения.
Но пока код сервлета остановился и ожидает, можно сделать так, чтобы поток, в котором выполняется код сервлета не простаивал, то есть, чтобы он пошел выполнять другую задачу. Для этого используется AsyncContext.
Пример программы:
1import java.util.*;
2import java.io.IOException;
3import java.io.PrintWriter;
4
5import javax.servlet.*;
6import javax.servlet.http.*;
7import javax.servlet.annotation.*;
8
9//нужно устанавливать asyncSupported в true
10@WebServlet(value = "/asyncservlet", asyncSupported = true)
11public class MyServlet extends HttpServlet {
12 @Override
13 protected void doGet (HttpServletRequest req,
14 HttpServletResponse resp)
15 throws ServletException, IOException {
16 PrintWriter pw = resp.getWriter();
17 AsyncContext asyncContext = req.startAsync();
18 //С запуском метода start код
19 //сервлета останавливаеться,
20 //но поток в котором выполняеться код
21 //сервлета не останавливаеться,
22 //он идет выполнять другую задачу
23 //если таковая имееться.
24 asyncContext.start(new Runnable() {
25 @Override
26 public void run () {
27 //запускаем метод sometask() и поток
28 //сервлета не зависнит как если бы мы
29 //запустили этот метод в отдельном
30 //потоке без AsyncContext
31 String message = sometask();
32 //Поток сервлета не застрянет и пойдет
33 //решать другую задачу (в данном случае других
34 //задач нету кроме выполняющегося
35 //метода sometask() поэтому поток сервлета
36 //пойдет выполнять sometask())
37 //в то время как код (не поток) сервлета
38 //сохраниться на том же месте где
39 //вызвался start() и будет ожидать завершения
40 //выполнения того что в run()
41 pw.println(message);
42 asyncContext.complete();
43 }
44 });
45 }
46
47 private String sometask () {
48 long start = System.currentTimeMillis();
49 long val = 0;
50 for(int i=0;i<2100000000;i++){
51 val++;
52 }
53 return "Value is "+val+" time to complete long task "
54 + (System.currentTimeMillis() - start);
55 }
56}Вывод:

Дополнительные материалы
(Здесь вы найдете полезные ссылки на материалы по теме. Это не обязательно, просто дополнительная информация.)
Следующие уроки
Азы работы с Java Server Pages (JSP)
17
мин.
Комментарии в JSP
11
мин.
Неявные объекты в JSP: session, request и др.
14
мин.
