Как избежать установки запроса ASYNC_SUPPORTED = true для включения обработки асинхронного сервлета 3.0 на Tomcat 7?

После сообщения о проблеме, связанной с этим вопросом, было найдено решение:

req.setAttribute("org.apache.catalina.ASYNC_SUPPORTED", true);

Это кажется немного странным и не совсем «переносимым» кодом (не повредит, но ...). Это похоже на Tomcat 7. Я использую Tomcat 7.0.14, поставляемый NetBeans 7.0.1.

Мне не удалось найти документацию, указывающую на необходимость включения обработки асинхронных запросов в сервлете 3.0 с атрибутом catalina. Мне не удалось найти документацию, указывающую на необходимость чего-то особенного на уровне конфигурации Tomcat.

Есть ли способ избежать установки ASYNC_SUPPORTED=true в каждом запросе для включения обработки асинхронного сервлета 3.0 в Tomcat 7?


person Jérôme Verstrynge    schedule 21.10.2011    source источник
comment
в Tomcat 7.0.27 req.startAsync() или req.startAsync(req, res) работает без ошибок и дополнительных настроек.   -  person user1516873    schedule 24.12.2012


Ответы (3)


Сначала нужно проверить пару вещей:

Убедитесь, что все фильтры, которые работают с запросом, также поддерживают асинхронный режим (как указано в одном из ответов на указанный вами вопрос) .

Убедитесь, что вы используете Servlet 3.0 web.xml - например:

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                             http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0"
         metadata-complete="true">
person kschneid    schedule 24.12.2012

Попробуйте обновить.

  • Ошибка 53623, исправленная в 7.0.30.
  • «Включить оставшиеся клапаны для поддержки асинхронной обработки сервлета 3». (исправлено в 7.0.16)

Полную информацию смотрите в Tomcat 7 ChangeLog.

Кроме того, если вы хотите использовать асинхронный режим, вам необходимо убедиться, что все фильтры и клапаны в цепочке (а также, конечно, сервлет) поддерживают асинхронный режим. Вероятно, это проблема в исходном вопросе, а также в вашем случае здесь.

person Christopher Schultz    schedule 28.12.2012
comment
Я использую Tomcat 7.0.34, версия сервлета в web.xml действительно 3.0, и все должно быть включено асинхронно (так как он работает с Jetty) - person Eugen; 29.12.2012
comment
@Eugen Jetty может интерпретировать спецификацию несколько иначе. Это работает в Jetty - это не твердый аргумент в пользу того, что в Tomcat есть ошибка. - person Christopher Schultz; 01.01.2013
comment
+1 за ссылку на недавние исправления ошибок. В последних 5 выпусках (7.0.30-35) есть много полезных исправлений асинхронных ошибок. - person ricosrealm; 22.01.2013

Я обнаружил, что org.apache.catalina.ASYNC_SUPPORTED=true нужен только тогда, когда вы переходите от одного обычного сервлета / jsp (внутренне) к асинхронному сервлету! Пример: в свой index.jsp я встроил <jsp:forward page="/path/AsyncServlet" /> Я обещаю, что AsyncServlet отлично работает как на Tomcat7, так и на Glassfish3, когда я запускаю его напрямую из браузера! Однако, когда я запускаю его с помощью index.jsp: Tomcat7 сообщает 500 для «Не поддерживается» Glassfish3 сообщает 500 для «Запрос находится в области действия фильтра или сервлета, который не поддерживает асинхронные операции» Если я встраиваю <% request.setAttribute("org.apache.catalina.ASYNC_SUPPORTED", true); %> перед <jsp:forward> в index.jsp , Tomcat7 работает нормально, но Glassfish3 по-прежнему ПЛОХО! Итак, я нашел решение как для Tomcat7, так и для Glassfish3 (без SYNC_SUPPORTED!): Просто ТОЧНО прикрепите следующие строки в web.xml:

<servlet>
    <servlet-name>indexPage</servlet-name>
    <jsp-file>/index.jsp</jsp-file>
    <async-supported>true</async-supported>
  </servlet>
  <servlet-mapping>
    <servlet-name>indexPage</servlet-name>
    <url-pattern>/index.jsp</url-pattern>
  </servlet-mapping>

Вывод (для меня): вы НЕ МОЖЕТЕ пересылать с обычного сервлета / jsp / filter на асинхронный! Поскольку функция async-запроса ДОЛЖНА быть предварительно установлена! Таким образом, обычное решение для сервлета / jsp / filter, который необходимо перенаправить на асинхронный сервлет: Используйте <servlet>/<async-supported>true или @WebServlet(asyncSupported = true) для предварительно обработанного сервлета; Используйте <servlet>/<async-supported>true для предварительно обработанного jsp Используйте <filter>/<async-supported>true или @WebFilter(asyncSupported = true) для предварительно обработанного фильтра; Надеюсь, это может немного помочь!

person Zhu Fei    schedule 10.08.2015