Проблема тайм-аута при обработке Tomcat 7 CometEvent - PullRequest
0 голосов
/ 23 сентября 2018

Я поддерживаю определенное веб-приложение, которое поддерживает длинные опросы (сервлет CometProcessor) и традиционные запросы сразу через один порт, и я сталкиваюсь с проблемой, когда число запросов в секунду растет (> 10).Таким образом, когда загрузка довольно высока, CometEvent.setTimeout () для события BEGIN, похоже, не устанавливается или что-то в этом роде, потому что событие ERROR / TIMEOUT не запускается до тех пор, пока загрузка не уменьшится.

Время ожидания устанавливается во время обработки события BEGIN

 try {
        if (sendResponse != null) {
            LOGGER.debug("Already has response. Sending...");

            client.onSend();

            event.getHttpServletResponse().setContentType("text/plain; charset=" + VirdConstants.DEFAULT_ENCODING);
            PrintWriter writer = event.getHttpServletResponse().getWriter();
            writer.write(sendResponse);
            writer.flush();
            LOGGER.debug("Sent to " + event.getHttpServletRequest().getRemoteAddr() + ":\n" + sendResponse);
            event.close();
        } else {
            event.setTimeout(getTimeout(isVisualizer(client.getId())));
        }
    } catch (Throwable e) {
        throw new RuntimeException(e);
    }

Приложение является устаревшим, поэтому его реорганизация связи затруднена.Я пытался играть с разными вариантами настройки, но безуспешно.

Есть ли способ улучшить это?Возможно, у кого-то возникла такая же проблема, или он может просто указать направление для исследования.

Конфигурация Tomcat:

<Server port="8005" shutdown="SHUTDOWN">
    <Listener className="org.apache.catalina.core.AprLifecycleListener"
          SSLEngine="on"/>
    <Listener className="org.apache.catalina.core.JasperListener"/>
    <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>
    <Listener
        className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
    <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/>

    <Service name="Catalina">
    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
              maxThreads="200" minSpareThreads="50" maxIdleTime="300000"
              prestartminSpareThreads="true"/>

    <Connector port="8080"
               protocol="org.apache.coyote.http11.Http11NioProtocol"
               enableLookups="false"
               acceptCount="50"
               acceptorThreadCount="2"
               compression="off"
               connectionTimeout="5000"
               executor="tomcatThreadPool"
               keepAliveTimeout="120000"
               maxKeepAliveRequests="512"
               maxConnections="2500"
               server="Apache"
               URIEncoding="UTF-8"
               />

    <Engine name="Catalina" defaultHost="localhost">
        <Host name="localhost" appBase="webapps" autoDeploy="true"/>
    </Engine>
</Service>

web.xml (part)

<servlet-mapping>
    <servlet-name>ReverseAjaxServlet</servlet-name>
    <url-pattern>/async/*</url-pattern>
</servlet-mapping>
<servlet>
    <servlet-name>ReverseAjaxServlet</servlet-name>
    <servlet-class>org.company.reverseajax.web.Tomcat7CometReverseAjaxServlet</servlet-class>
    <init-param>
        <param-name>timeout</param-name>
        <param-value>60000</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...