2010-11-05 20 views
22

Aquí está mi web.xmlservlet asíncrono apoya-3.0 no funciona

<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, tiene 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 me puede ayudar en ¿esta? muchas gracias.

+0

mostrar todo el web.xml (al menos la definición de la etiqueta '' con los espacios de nombres) – Bozho

Respuesta

45

Porque su servlet y cualquier otro filtro en la cadena debe tener <async-supported>true</async-supported> en web.xml.

+0

¿cómo hacer esto con la anotación? – necromancer

+6

@WebFilter (urlPatterns = "/ *", asyncSupported = true) – necromancer

4

Llamas recursivamente this.doFilter(req, res, chain);.

Si desea continuar con la cadena, debe invocar chain.doFilter(httpRequest, httpResponse); en lugar de this.doFilter(req, res, chain);.

4

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> 
0

Sé 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 url-patrón de servlet no era correcto.

<servlet-mapping> 
    <servlet-name>MyServlet</servlet-name> 
    <url-pattern>/pattern/</url-pattern> <--- 
    </servlet-mapping> 

Espero que sea de alguna utilidad.

2

Peter Karabinovich, tu respuesta no es verdad. De Servlet 3.0 especificaciones:

2.3.3.3 procesamiento asíncrono
...
Despacho desde un servlet que ha asyncSupported = true a uno donde asyncSupported se establece en false se permitió. En este caso, la respuesta será comete cuando el método de servicio del servlet que no soporta asíncrono se salió ...

3

Se puede utilizar para la correspondencia asíncrona de anotación servlet como este

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

public class YourServlet extends HttpServlet { } 
Cuestiones relacionadas