2011-10-21 16 views
13

Tras un problema reportado en este question, se encontró una solución:Cómo evitar la solicitud establecer ASYNC_SUPPORTED = true para habilitar el procesamiento de servlet 3.0 asíncrono en Tomcat 7?

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

esto parece un poco extraño y no es realmente código de 'portátil' (no le hará daño, pero ...). Parece específico para Tomcat 7. Estoy usando Tomcat 7.0.14 según lo entregado por NetBeans 7.0.1.

No pude encontrar la documentación que indique que es necesario habilitar el procesamiento de solicitud asíncrona en servlet 3.0 con un atributo catalina. No pude encontrar la documentación que indica que algo especial era necesario en el nivel de configuración de Tomcat también.

¿Hay alguna forma de evitar tener que establecer ASYNC_SUPPORTED=true en cada solicitud para habilitar el procesamiento de servlet 3.0 asíncrono en Tomcat 7?

+0

en Tomcat 7.0.27 'req.startAsync()' o 'req.startAsync (req, res)' funciona sin errores y configuraciones adicionales. – user1516873

Respuesta

7

Un par de cosas para comprobar en primer lugar:

asegurarse de que cualquier filtros que operan en la solicitud también apoyar asíncrono (como se aborda en one of the answers a la pregunta que hizo referencia).

asegurarse de que está utilizando un Servlet 3.0 web.xml - por ejemplo:

<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"> 
4

actualización intento.

  • Bug 53623 corregidos en 7.0.30.
  • "Habilite las válvulas restantes para el soporte de procesamiento asíncrono del Servlet 3". (fijado en 7.0.16)

Compruebe el Tomcat 7 ChangeLog para obtener detalles completos.

Además, si desea utilizar la función asincrónica, deberá asegurarse de que todos los filtros y las válvulas de la cadena (así como el servlet, por supuesto) admiten asincrónicamente. Este es probablemente el problema en la pregunta original, así como con su caso, aquí.

+0

Votación descendente sin explicación? :/ –

+0

Estoy usando Tomcat 7.0.34, la versión de servlet en web.xml es de hecho 3.0 y todo debe estar habilitado para sincronizar (ya que funciona con Jetty) – Eugen

+0

@Eugen Jetty podría interpretar las especificaciones de forma ligeramente diferente. "Funciona en Jetty" no es un argumento sólido que Tomcat tenga un error. –

1

¡Descubrí que org.apache.catalina.ASYNC_SUPPORTED=true solo es necesario cuando se pasa de un servlet normal/jsp (internamente) a un servlet asíncrono! Ejemplo: En mi index.jsp, incorporo <jsp:forward page="/path/AsyncServlet" /> ¡Prometo que AsyncServlet funciona bien tanto en Tomcat7 como en Glassfish3, cuando lo desencadeno directamente desde el navegador! Sin embargo, cuando los activa por index.jsp: Tomcat7 informes 500 para "no compatible" Glassfish3 reporta 500 para "Solicitud está dentro del alcance de un filtro o servlet que no admite las operaciones asíncronas" Si lo integrar <% request.setAttribute("org.apache.catalina.ASYNC_SUPPORTED", true); %> antes <jsp:forward> en index.jsp, Tomcat7 funciona bien, ¡pero Glassfish3 sigue siendo MALO! así que encontré una solución para ambos Tomcat7 y Glassfish3 (sin SYNC_SUPPORTED!): exactamente adjuntar siguientes en 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> 

Conclusión (para mí): Usted no puede reenviar desde un servlet-normales/jsp/filter a un asincrónico! ¡Ya que la función de solicitud asíncrona DEBE estar preestablecida! Así que la solución común para un servlet/jsp/filtro que necesita reenviar a un servlet asíncrono es: Use <servlet>/<async-supported>true o @WebServlet(asyncSupported = true) para un servlet preprocesado; Utilice <servlet>/<async-supported>true para un jsp preprocesado Use <filter>/<async-supported>true o @WebFilter(asyncSupported = true) para obtener un filtro preprocesado; ¡Espero que esto ayude un poco!

Cuestiones relacionadas