Servlet 3.0 Async-поддерживается не работает - PullRequest
23 голосов
/ 05 ноября 2010

Вот мой web.xml

    <filter>
    <filter-name>pollingTest</filter-name>
    <filter-class>
        webapp.controller.core.servlet.PollingService
            </filter-class>
    <async-supported>true</async-supported>
</filter>
<filter-mapping>
    <filter-name>pollingTest</filter-name>
    <url-pattern>/app/poll</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>ASYNC</dispatcher>
</filter-mapping>

Вот класс:

public class PollingService implements Filter {
Logger logger = LoggerFactory.getLogger(getClass());

@Override
public void destroy() {
    logger.info("Destroy");
}

@Override
public void doFilter(ServletRequest req, ServletResponse res,
        FilterChain chain) throws IOException, ServletException {

    logger.info("Running");
    req.startAsync(req, res);
    this.doFilter(req, res, chain);
    return;
}

@Override
public void init(FilterConfig arg0) throws ServletException {

    logger.info("Init=");
}

}

Я запускаю его на Glassfish, а также на Tomcat 7, получил исключение:

java.lang.IllegalStateException: Request is within the scope of a filter or servlet that does not support asynchronous operations
at org.apache.catalina.connector.Request.startAsync(Request.java:3657)
at org.apache.catalina.connector.Request.startAsync(Request.java:3633)
at org.apache.catalina.connector.RequestFacade.startAsync(RequestFacade.java:1053)
at javax.servlet.ServletRequestWrapper.startAsync(ServletRequestWrapper.java:450)

Кто может мне помочь в этом? Большое спасибо.

Ответы [ 6 ]

49 голосов
/ 28 апреля 2011

Потому что ваш сервлет и любой другой фильтр в цепочке должны иметь <async-supported>true</async-supported> в web.xml.

5 голосов
/ 03 октября 2013

У меня была похожая проблема, но в моем случае этого было недостаточно.Если вы используете теги Context и Valve (в tomcat7 - service.xml), вы должны добавить параметр asyncSupported = "true" в значение тега.Тогда это сработало.

<Context docBase="aaa" path="/aaa" reloadable="true" source="org.eclipse.jst.jee.server:aaa"><Valve className="cz.tomcatUtil.ForceUserValve" user="DZC0GRP" asyncSupported="true"/></Context>
4 голосов
/ 09 апреля 2013

Вы звоните рекурсивно this.doFilter(req, res, chain);.

Если вы хотите продолжить цепочку, вы должны вызвать chain.doFilter(httpRequest, httpResponse); вместо this.doFilter(req, res, chain);.

3 голосов
/ 25 мая 2014

Вы можете использовать аннотацию для отображения асинхронного сервлета следующим образом

@WebServlet(urlPatterns = {"/yourServlet"}, **asyncSupported=true**)

public class YourServlet extends HttpServlet { }
2 голосов
/ 23 мая 2014

Петр Карабинович, вы отвечаете не верно.Из спецификации Servlet 3.0:

2.3.3.3 Асинхронная обработка
...
Отправка из сервлета, для которого asyncSupported = true, где asyncSupported имеет значениеfalse разрешено .В этом случае ответ будет зафиксирован, когда будет завершен сервисный метод сервлета, который не поддерживает асинхронность ...

0 голосов
/ 12 февраля 2014

Я знаю это старое сообщение, но я хотел бы поделиться своим решением.Мне потребовалась 1 неделя, чтобы выяснить причину, потому что я попробовал почти все возможные варианты решения.

Для меня шаблон URL сервлета был неправильным.некоторого использования.

...