Топ-100Курс Java: Оптимизация Java-cервлетов с помощью AsyncContext - Codorbits
LogoCodOrbits

Раздел: Servlets

Познакомьтесь с сервлетами Java: создание динамических веб-страниц и работа с HTTP-запросами и ответами.

Все разделы
Иконка Servlets

Оптимизация 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}

Вывод:


Дополнительные материалы

Additional Material Icon

Следующие уроки

Азы работы с Java Server Pages (JSP)

17
мин.

Similar Articles Icon
Divider

Комментарии в JSP

11
мин.

Similar Articles Icon
Divider

Неявные объекты в JSP: session, request и др.

14
мин.

Similar Articles Icon