Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Async Servlets / 25 сообщений из 75, страница 1 из 3
12.12.2020, 00:18
    #40027079
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Async Servlets
Привет котаны-бротаны!

1) Кто использовал сабж? Какие выгоды получили?
2) Асинк-сервлет == Async IO ?
3) Какие сервера поддерживают (JBoss, Tomcat, Jetty e.t.c)
4) Технологии Java(jakkarta)EE? Весенний ботинок spring-boot?

С пятницей вас.
...
Рейтинг: 0 / 0
12.12.2020, 15:00
    #40027139
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Async Servlets
Тематически связный документ

JSR-000340 JavaTM Servlet 3.1 Final Release for Evaluation
https://download.oracle.com/otndocs/jcp/servlet-3_1-fr-eval-spec/index.html
...
Рейтинг: 0 / 0
12.12.2020, 17:12
    #40027186
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Async Servlets
Один сниппет.

Код: java
1.
2.
3.
4.
@WebServlet(value = "/asyncservlet", asyncSupported = true)
public class AsyncLongRunningServlet extends HttpServlet {

}
...
Рейтинг: 0 / 0
12.12.2020, 18:13
    #40027213
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Async Servlets
mayton,

Понед попробую сделать демку.
Но там же для тестов jMeter еще(
Его я не юзал. Попробуем.
...
Рейтинг: 0 / 0
12.12.2020, 21:20
    #40027269
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Async Servlets
Хм... привычным движением руки приподнял версию jetty с девятки до одинадцатки (там между ними
какие-то нестабильные были и сломал хороший конструктор.

pom.xml
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

        <!--jetty.server.version>11.0.0</jetty.server.version>
        <jetty.servlet.version>11.0.0</jetty.servlet.version-->

        <jetty.server.version>9.4.35.v20201120</jetty.server.version>
        <jetty.servlet.version>9.4.35.v20201120</jetty.servlet.version>

...................

        <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-server</artifactId>
            <version>${jetty.server.version}</version>
        </dependency>

        <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-jmx</artifactId>
            <version>${jetty.server.version}</version>
        </dependency>

        <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-servlet</artifactId>
            <version>${jetty.servlet.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpmime</artifactId>
            <version>${httpcomponents.version}</version>
        </dependency>

...
Рейтинг: 0 / 0
12.12.2020, 21:34
    #40027272
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Async Servlets
mayton,
А как мавеном все очистить иивернуть взад) если нет веба на машинке?
Он вместо очистки на clear лезет в веб собака?
...
Рейтинг: 0 / 0
12.12.2020, 21:43
    #40027275
Kachalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Async Servlets
mayton
Какие выгоды получили?

Глубокий разбор темы от Viacheslav Kolbasin:
YouTube Video
...
Рейтинг: 0 / 0
12.12.2020, 22:06
    #40027277
Sergunka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Async Servlets
mayton
Один сниппет.

Код: java
1.
2.
3.
4.
@WebServlet(value = "/asyncservlet", asyncSupported = true)
public class AsyncLongRunningServlet extends HttpServlet {

}



Сейчас вроде как все сидят на REST под spring фреймворком редко где нужен сервлет. На спринге просто ставишь опцию @Async и вроде как все.

https://www.baeldung.com/spring-async

Последний раз юзал когда надо было грузить большие файлы в блобсторе.
...
Рейтинг: 0 / 0
12.12.2020, 22:16
    #40027280
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Async Servlets
PetroNotC Sharp
mayton,
А как мавеном все очистить иивернуть взад) если нет веба на машинке?
Он вместо очистки на clear лезет в веб собака?

Есть offline mode.
Тяпничная подготовка к работе на дому (ворчалка)

Но если maven полез в веб - то значит ему не хватает какой-то dependency и ее все равно надо скачать.
...
Рейтинг: 0 / 0
12.12.2020, 22:19
    #40027281
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Async Servlets
В продолжение апргейде версии jetty.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
package mayton.web;

import org.apache.commons.cli.*;
import org.eclipse.jetty.jmx.MBeanContainer;
import org.eclipse.jetty.server.*;
import org.eclipse.jetty.server.handler.*;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.util.log.Log;
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.http.HttpServlet;
import java.lang.management.GarbageCollectorMXBean;
import java.lang.management.ManagementFactory;
import java.util.List;
import java.util.Properties;

import static org.eclipse.jetty.servlet.ServletContextHandler.NO_SECURITY;
import static org.eclipse.jetty.servlet.ServletContextHandler.NO_SESSIONS;

public class MediaShare {

    static Logger logger = LoggerFactory.getLogger(MediaShare.class);

    public void  initJMX(Server server){
        // Setup JMX
        MBeanContainer mbContainer=new MBeanContainer(ManagementFactory.getPlatformMBeanServer());
        server.addEventListener(mbContainer);
        server.addBean(mbContainer);
        server.addBean(Log.getLog());
    }

    @NotNull
    Options createOptions() {
        return new Options()
                .addRequiredOption("h", "host", true, "Ethernet Host Interace to listen, ex: 127.0.0.1, ::::1")
                .addRequiredOption("p", "port", true, "Port number to listen, ex: 8081")
                .addRequiredOption("r", "root", true, "File root, ex: /www/html");
    }


    public void go(Properties properties) throws Exception {
        Server server = new Server();

        initJMX(server);

        server.setRequestLog((request, response) ->
                logger.info("{} {}", request.getRemoteHost(), request.getRequestURI()
        ));

        try(ServerConnector connector = new ServerConnector(server)) {

            int port = Integer.parseInt(properties.getProperty("port"));
            String host = properties.getProperty("host");

            connector.setPort(port);
            connector.setHost(host);
            connector.setName("Connector-1");

            server.setConnectors(new Connector[]{connector});

            ServletContextHandler servletContextHandler = new ServletContextHandler(NO_SESSIONS | NO_SECURITY);

            HttpServlet root = new DirectoryServlet(properties.getProperty("root"));

            servletContextHandler.addServlet(new ServletHolder(root), "/");

            ResourceHandler resourceHandler = new ResourceHandler();
            resourceHandler.setResourceBase("css");
            resourceHandler.setDirectoriesListed(false);

            HandlerCollection handlers = new HandlerCollection();

            handlers.setHandlers(new Handler[]{
                    resourceHandler,
                    servletContextHandler,
                    new DefaultHandler()}
            );

            server.setHandler(handlers);
            server.start();
            server.join();
        }
    }



Код: java
1.
2.
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project jetty-media-share: Compilation failure
[ERROR] /home/mayton/git/JettyShare/jetty-media-share/src/main/java/mayton/web/MediaShare.java:[68,46] no suitable constructor found for ServletHolder(javax.servlet.http.HttpServlet)
...
Рейтинг: 0 / 0
12.12.2020, 23:19
    #40027293
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Async Servlets
Вот еще презентация по теме https://www.slideshare.net/SimoneBordet/servlet-31-async-io

Здесь возможно есть ответ на мой вопрос.

2) Асинк-сервлет == Async IO ?
...
Рейтинг: 0 / 0
13.12.2020, 00:21
    #40027320
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Async Servlets
mayton,
Да без разницы IO это или нет.
Разрабы сей фичи жалеют потоки контейнера или веб сервера. Их типо всего 200 штук и надо экономнее. Побыстрее освобождать.
Хотя причем тут прогеры?
...
Рейтинг: 0 / 0
13.12.2020, 00:28
    #40027323
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Async Servlets
Это ... какой-то лютый 3.14дец.

Вот бранч jetty-10.0.x проекта jetty.project. Стоит в конструкторе нормальный сервлет.

Код: java
1.
2.
3.
4.
5.
6.
7.
import javax.servlet.Servlet;
...
    public ServletHolder(Servlet servlet)
    {
        this(Source.EMBEDDED);
        setServlet(servlet);
    }



Вот мастер бранч. Он-же синоним одинадцатки. Какой-то штопаный кондом заменяет нормальный сервлет
на import jakarta.servlet.Servlet;

Код: java
1.
2.
3.
4.
5.
6.
7.
import jakarta.servlet.Servlet;
...
    public ServletHolder(Servlet servlet)
    {
        this(Source.EMBEDDED);
        setServlet(servlet);
    }



Да у меня чуть глаза не лопнули. Я вглядывался почему не компилируется. Туловище конструктора не меняется
но компиллятор не видит нужную перегрузку.

Ладно. Сойдем на десятку. Чорт с ним. Это поинт к тому чтоб не гнаться за модой.
...
Рейтинг: 0 / 0
13.12.2020, 14:25
    #40027409
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Async Servlets
mayton,

асинхронные сервлеты счас выглядят как велосипед - всё просто решается через websocket.
...
Рейтинг: 0 / 0
13.12.2020, 16:04
    #40027438
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Async Servlets
Какую связь ты увидел между WebSockets и темой топика?
...
Рейтинг: 0 / 0
13.12.2020, 16:12
    #40027440
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Async Servlets
mayton
Какую связь ты увидел между WebSockets и темой топика?
в большей части по отношению к видео.
но вопрос применения этих асинхронных штук интересен.
а также есть вопрос - не есть ли это нечто похожим на http2 ?
про которое уже есть статьи про фактически нулевой эффект от использования...
...
Рейтинг: 0 / 0
13.12.2020, 16:38
    #40027446
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Async Servlets
Ты - практик? Познаешь мир через физические эксперименты. Я - тоже такой.
Но хоть иногда надо открывать нормативные доки чтоб синхронизировать своё
миро-восприятие с тем как это видят разработчики фреймворков и технологий
которые ты же используешь.

В документе под названием Java Servlet Spec Version 3.1 нет вообще ни слова про WebSockets.
...
Рейтинг: 0 / 0
13.12.2020, 17:39
    #40027456
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Async Servlets
вадя
но вопрос применения этих асинхронных штук интересен.
давай начнем в твоей теме обсуждать. Там самое место если правда интересно.
...
Рейтинг: 0 / 0
13.12.2020, 17:56
    #40027463
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Async Servlets
mayton
В документе под названием Java Servlet Spec Version 3.1 нет вообще ни слова про WebSockets.
и не должно быть. это были просто замечания. чтоб можно было при опытах обратить на это внимание и найти общее и сравнивать по ходу дела.
PetroNotC Sharp
вадя
но вопрос применения этих асинхронных штук интересен.
давай начнем в твоей теме обсуждать. Там самое место если правда интересно.
а это к тому что поддерживаю исследования и жду мнения.
...
Рейтинг: 0 / 0
13.12.2020, 18:13
    #40027465
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Async Servlets
вадя
жду мнения.

Увы. Выше сказали что сервлеты используют единицы.
А в спринге просто ставим @Async.
...
Рейтинг: 0 / 0
13.12.2020, 18:42
    #40027470
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Async Servlets
PetroNotC Sharp
А в спринге просто ставим @Async.
с модными течениями трудно спорить
...
Рейтинг: 0 / 0
13.12.2020, 20:11
    #40027494
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Async Servlets
Немного переделал с WebAppContext, но что-то не стартует.
(Не хочу использовать все эти уродские web.xml). Думаю что базовогООП и композиции
достаточно чтоб сделать все конфигурационные шаги.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
    public static void main(String[] args) throws Exception {

        Server server = new Server();

        server.setRequestLog((request, response) -> logger.info("{} {}", request.getRemoteHost(), request.getRequestURI()));

        try(ServerConnector connector = new ServerConnector(server)) {

            connector.setPort(8082);
            connector.setHost("192.168.1.200");
            connector.setName("Connector-1");

            //server.addEventListener(new AppContextListener());
            //server.addEventListener(new AppAsyncListener());

            server.setConnectors(new Connector[]{connector});

            //ServletContextHandler servletContextHandler = new ServletContextHandler(NO_SESSIONS | NO_SECURITY);

            Servlet longRunningServlet = new LongRunningServlet();

            //servletContextHandler.addServlet(new ServletHolder(longRunningServlet),      "/run");

            Servlet asyncLongRunningServlet = new AsyncLongRunningServlet();

            //servletContextHandler.addServlet(new ServletHolder(asyncLongRunningServlet), "/asyncrun");

            ResourceHandler resourceHandler = new ResourceHandler();
                resourceHandler.setResourceBase("css");
                resourceHandler.setDirectoriesListed(false);

            HandlerCollection handlers = new HandlerCollection();

            WebAppContext webAppContext = new WebAppContext();
                webAppContext.addEventListener(new AppContextListener());
                webAppContext.addEventListener(new AppAsyncListener());

                webAppContext.addServlet(new ServletHolder(longRunningServlet),      "/run");
                webAppContext.addServlet(new ServletHolder(asyncLongRunningServlet), "/asyncrun");


            handlers.addHandler(webAppContext);
            handlers.addHandler(resourceHandler);
            handlers.addHandler(new DefaultHandler());
            
            /*handlers.setHandlers(new Handler[]{
                    resourceHandler,
                    servletContextHandler,
                    new DefaultHandler()}
            );*/

            server.setHandler(handlers);
            server.start();
            server.join();
        }
    }




Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
....
19:07:06,755 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [FILE] to Logger[ROOT]
19:07:06,755 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
19:07:06,756 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@3c72f59f - Registering current configuration as safe fallback point

[INFO ] :: Server : jetty-10.0.0; built: 2020-12-02T21:06:43.949Z; git: b9645a17373e4e9b7f30b6c0a07defcea2cb660b; jvm 11.0.9.1+1-Ubuntu-0ubuntu1.20.04
[WARN ] :: WebAppContext : Failed startup of context o.e.j.w.WebAppContext@1807e3f6{/,null,STOPPED}
java.lang.IllegalStateException: No resourceBase or war set for context
	at org.eclipse.jetty.webapp.WebInfConfiguration.unpack(WebInfConfiguration.java:298)
	at org.eclipse.jetty.webapp.WebInfConfiguration.preConfigure(WebInfConfiguration.java:61)
	at org.eclipse.jetty.webapp.Configurations.preConfigure(Configurations.java:495)
	at org.eclipse.jetty.webapp.WebAppContext.preConfigure(WebAppContext.java:514)
	at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:536)
	at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:98)
	at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:174)
	at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:124)
	at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:94)
	at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:98)
	at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:174)
	at org.eclipse.jetty.server.Server.start(Server.java:474)
	at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:117)
	at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:94)
	at org.eclipse.jetty.server.Server.doStart(Server.java:419)
	at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:98)
	at mayton.servlets.JettyMain.main(JettyMain.java:80)
[INFO ] :: AbstractConnector : Started Connector-1@128d2484{HTTP/1.1, (http/1.1)}{192.168.1.200:8082}
[INFO ] :: Server : Started Server@4d5b6aac{STARTING}[10.0.0,sto=0] @612ms
...
Рейтинг: 0 / 0
13.12.2020, 20:20
    #40027496
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Async Servlets
mayton
Не хочу использовать все эти уродские web.xml
нууу, вы хотите писат в java как сишники. Не получится.
...
Рейтинг: 0 / 0
13.12.2020, 20:25
    #40027499
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Async Servlets
Я с вашего позволения попробую. Предыдущий вариант работал хотя сервлеты были ущербны без конфигов.
...
Рейтинг: 0 / 0
13.12.2020, 20:35
    #40027503
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Async Servlets
Добавил. Вроде работает.

Код: java
1.
webAppContext.setResourceBase("/");



И правильно отрабатывает таймауты. Полезная фича кстати.

5 секунд.

Код: java
1.
mayton@ryzen-ssd:/storage/git.java$ wget http://192.168.1.200:8082/asyncrun?time=5 -o/dev/null



Лог.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
19:32:07,602 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@3c72f59f - Registering current configuration as safe fallback point

[INFO ] :: Server : jetty-10.0.0; built: 2020-12-02T21:06:43.949Z; git: b9645a17373e4e9b7f30b6c0a07defcea2cb660b; jvm 11.0.9.1+1-Ubuntu-0ubuntu1.20.04
[INFO ] :: StandardDescriptorProcessor : NO JSP Support for /, did not find org.eclipse.jetty.jsp.JettyJspServlet
[INFO ] :: DefaultSessionIdManager : Session workerName=node0
[INFO ] :: AppContextListener : :: call contextInitialized()
[INFO ] :: AsyncLongRunningServlet : :: init
[INFO ] :: ContextHandler : Started o.e.j.w.WebAppContext@3fa247d1{/,file:///,AVAILABLE}
[INFO ] :: AbstractConnector : Started Connector-1@128d2484{HTTP/1.1, (http/1.1)}{192.168.1.200:8082}
[INFO ] :: Server : Started Server@4d5b6aac{STARTING}[10.0.0,sto=0] @635ms
[INFO ] :: AsyncLongRunningServlet : AsyncLongRunningServlet Start::Name=qtp524241174-22 ::ID=22
[INFO ] :: AsyncLongRunningServlet : LongRunningServlet Start::Name=qtp524241174-22 ::ID=22 ::Time Taken=4 ms
[INFO ] :: AsyncRequestProcessor : Async Supported? true
[INFO ] :: AppAsyncListener : :: on Complete
[INFO ] :: JettyMain : 192.168.1.200 /asyncrun



С таймаутом в 20 секунд.

Код: java
1.
mayton@ryzen-ssd:/storage/git.java$ wget http://192.168.1.200:8082/asyncrun?time=20 -o/dev/null



Лог

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
[INFO ] :: AsyncLongRunningServlet : AsyncLongRunningServlet Start::Name=qtp524241174-22 ::ID=22
[INFO ] :: AsyncLongRunningServlet : LongRunningServlet Start::Name=qtp524241174-22 ::ID=22 ::Time Taken=0 ms
[INFO ] :: AsyncRequestProcessor : Async Supported? true
[INFO ] :: AppAsyncListener : :: on timeout
[INFO ] :: AppAsyncListener : :: on Complete
[INFO ] :: JettyMain : 192.168.1.200 /asyncrun
Exception in thread "pool-1-thread-2" java.lang.IllegalStateException: AsyncContext completed and/or Request lifecycle recycled
	at org.eclipse.jetty.server.AsyncContextState.state(AsyncContextState.java:52)
	at org.eclipse.jetty.server.AsyncContextState.getResponse(AsyncContextState.java:118)
	at mayton.servlets.AsyncRequestProcessor.run(AsyncRequestProcessor.java:27)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:834)


Мой пример является просто копи-пастой отсюда https://www.journaldev.com/2008/async-servlet-example
. Я только адаптировал под Jetty и добавил человеческое логгирование.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Async Servlets / 25 сообщений из 75, страница 1 из 3
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]