servlets - filtros - Servlet 3.0 Async-supported no funciona
servlet filter login (6)
Aquí está mi 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>
Aquí está la clase:
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=");
}
}
Lo ejecuto en glassfish y también en tomcat 7, tengo una excepción:
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)
¿Quién puede ayudarme en esto? muchas gracias.
Debido a que su servlet y cualquier otro filtro en la cadena debe tener <async-supported>true</async-supported>
en web.xml.
Estás llamando recursivamente this.doFilter(req, res, chain);
.
Si desea continuar la cadena, debe invocar chain.doFilter(httpRequest, httpResponse);
en lugar de this.doFilter(req, res, chain);
.
Peter Karabinovich, tu respuesta no es verdad. De la especificación de Servlet 3.0:
2.3.3.3 Procesamiento asincrónico
...
Se permite el envío desde un servlet que tiene asyncSupported = true a uno donde asyncSupported está configurado como falso. En este caso, la respuesta se confirmará cuando se abandone el método de servicio del servlet que no admite async ...
Puede usar Anotación para asignar el servlet asíncrono como este
@WebServlet(urlPatterns = {"/yourServlet"}, **asyncSupported=true**)
public class YourServlet extends HttpServlet { }
Sé que esta es una publicación anterior, pero me gustaría compartir mi solución. Me llevó 1 semana descubrir la causa porque había intentado casi intenté todas las soluciones posibles.
Para mí, el patrón de URL del servlet no era correcto.
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/pattern/</url-pattern> <---
</servlet-mapping>
Espero que sea de alguna utilidad.
Tuve un problema similar, pero en mi caso, no fue suficiente. Si usa las etiquetas Context y Valve (en tomcat7 - service.xml), debe agregar el parámetro asyncSupported = "true" en el valor de la etiqueta. Entonces había funcionado.
<Context docBase="aaa" path="/aaa" reloadable="true" source="org.eclipse.jst.jee.server:aaa"><Valve className="cz.tomcatUtil.ForceUserValve" user="DZC0GRP" asyncSupported="true"/></Context>