powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Async Servlets
25 сообщений из 75, страница 1 из 3
Async Servlets
    #40027079
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет котаны-бротаны!

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

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

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
Async Servlets
    #40027186
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Один сниппет.

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

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

Понед попробую сделать демку.
Но там же для тестов jMeter еще(
Его я не юзал. Попробуем.
...
Рейтинг: 0 / 0
Async Servlets
    #40027269
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм... привычным движением руки приподнял версию 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
Async Servlets
    #40027272
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
А как мавеном все очистить иивернуть взад) если нет веба на машинке?
Он вместо очистки на clear лезет в веб собака?
...
Рейтинг: 0 / 0
Async Servlets
    #40027275
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Какие выгоды получили?

Глубокий разбор темы от Viacheslav Kolbasin:
YouTube Video
...
Рейтинг: 0 / 0
Async Servlets
    #40027277
Sergunka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Async Servlets
    #40027280
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
mayton,
А как мавеном все очистить иивернуть взад) если нет веба на машинке?
Он вместо очистки на clear лезет в веб собака?

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

Но если maven полез в веб - то значит ему не хватает какой-то dependency и ее все равно надо скачать.
...
Рейтинг: 0 / 0
Async Servlets
    #40027281
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В продолжение апргейде версии 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
Async Servlets
    #40027293
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот еще презентация по теме https://www.slideshare.net/SimoneBordet/servlet-31-async-io

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

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

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

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

Увы. Выше сказали что сервлеты используют единицы.
А в спринге просто ставим @Async.
...
Рейтинг: 0 / 0
Async Servlets
    #40027470
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
А в спринге просто ставим @Async.
с модными течениями трудно спорить
...
Рейтинг: 0 / 0
Async Servlets
    #40027494
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Немного переделал с 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
Async Servlets
    #40027496
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Не хочу использовать все эти уродские web.xml
нууу, вы хотите писат в java как сишники. Не получится.
...
Рейтинг: 0 / 0
Async Servlets
    #40027499
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я с вашего позволения попробую. Предыдущий вариант работал хотя сервлеты были ущербны без конфигов.
...
Рейтинг: 0 / 0
Async Servlets
    #40027503
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавил. Вроде работает.

Код: 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
25 сообщений из 75, страница 1 из 3
Форумы / Java [игнор отключен] [закрыт для гостей] / Async Servlets
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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