Servlet 3.0 Async-поддерживается не работает
Вот мой 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 ответов
Потому что ваш сервлет и любой другой фильтр в цепочке должен иметь <async-supported>true</async-supported>
в web.xml.
У меня была похожая проблема, но в моем случае этого было недостаточно. Если вы используете теги 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>
Вы звоните рекурсивно this.doFilter(req, res, chain);
,
Если вы хотите продолжить цепочку, вы должны вызвать chain.doFilter(httpRequest, httpResponse);
вместо this.doFilter(req, res, chain);
,
Вы можете использовать аннотацию для отображения асинхронного сервлета, как это
@WebServlet(urlPatterns = {"/yourServlet"}, **asyncSupported=true**)
public class YourServlet extends HttpServlet { }
Петр Карабинович, ты отвечаешь не верно. Из Servlet 3.0 spec:
2.3.3.3 Асинхронная обработка
...
Разрешается отправка из сервлета с asyncSupported=true к серверу, для которого asyncSupported установлено значение false. В этом случае ответ будет зафиксирован, когда будет завершен метод обслуживания сервлета, который не поддерживает асинхронность...
Я знаю это старый пост, но я хотел бы поделиться своим решением. Мне потребовалась 1 неделя, чтобы выяснить причину, потому что я попробовал почти все возможные решения.
Для меня url-шаблон сервлета был неправильным.
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/pattern/</url-pattern> <---
</servlet-mapping>
Надеюсь, что это будет полезно.