2011-10-21 8 views
13

A seguito di un problema segnalato su questo question, è stato trovato una soluzione:Come evitare la richiesta set ASYNC_SUPPORTED = true per abilitare l'elaborazione async servlet 3.0 su Tomcat 7?

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

questo sembra un po 'strano e non è davvero il codice 'portatile'(non farà male, ma ...). Sembra specifico per Tomcat 7. Uso Tomcat 7.0.14 come fornito da NetBeans 7.0.1.

Non sono riuscito a trovare la documentazione che indica che è necessario abilitare l'elaborazione di richieste asincrone nel servlet 3.0 con un attributo catalina. Non sono riuscito a trovare documentazione indicante che fosse necessario qualcosa di speciale anche a livello di configurazione Tomcat.

C'è un modo per evitare di dover impostare ASYNC_SUPPORTED=true in ogni richiesta per abilitare l'elaborazione async servlet 3.0 in Tomcat 7?

+0

in Tomcat 7.0.27 'req.startAsync()' o 'req.startAsync (req, res)' funziona senza errori e impostazioni aggiuntive. – user1516873

risposta

7

Un paio di cose da controllare prima:

assicurarsi eventuali filtri che operano su richiesta anche supportare asincrona (come affrontato in one of the answers alla domanda si fa riferimento).

assicurarsi che si sta utilizzando un web.xml Servlet 3.0 - ad esempio:

<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

Prova aggiornamento.

  • Bug 53623 risolto in 7.0.30.
  • "Abilita le restanti valvole per supporto elaborazione asincrona Servlet 3". (riparato in 7.0.16)

Controllare il Tomcat 7 ChangeLog per i dettagli completi.

Inoltre, se si desidera utilizzare async, è necessario assicurarsi che tutti i filtri e le valvole della catena (nonché il servlet, ovviamente) supportino tutti async. Questo è probabilmente il problema nella domanda originale, così come nel caso, qui.

+0

Downvote senza spiegazione? :/ –

+0

Sto usando Tomcat 7.0.34, la versione servlet in web.xml è effettivamente 3.0 e tutto dovrebbe essere abilitato async (dal momento che sta funzionando con Jetty) – Eugen

+0

@Eugen Jetty potrebbe interpretare la specifica leggermente in modo diverso. "Funziona in Jetty" non è un argomento solido come quello che Tomcat ha un bug. –

1

Ho trovato che org.apache.catalina.ASYNC_SUPPORTED=true è necessario solo quando si da un normale servlet/jsp (internamente) in avanti a un servlet asincrono! Esempio: nel mio file index.jsp, incorporo <jsp:forward page="/path/AsyncServlet" /> Prometto che AsyncServlet funziona correttamente su Tomcat7 e Glassfish3, quando lo faccio direttamente dal browser! Tuttavia quando ho innescare da index.jsp: Tomcat7 rapporti 500 per "Non supportato" Glassfish3 riporta 500 per "Richiesta rientra nell'ambito di applicazione di un filtro o servlet che non supporta operazioni asincrone" Se ho incorporare <% request.setAttribute("org.apache.catalina.ASYNC_SUPPORTED", true); %> prima <jsp:forward> in index.jsp, Tomcat7 va bene, ma Glassfish3 è ancora BAD! così ho trovato una soluzione per entrambi Tomcat7 e Glassfish3 (senza SYNC_SUPPORTED!): esattamente allegare seguenti in 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> 

Conclusione (per me): Non è possibile in avanti da una normale servlet/jsp/filter su un async-one! Poiché la funzione di richiesta asincrona DEVE essere preimpostata! Quindi la soluzione comune per un servlet/jsp/filter che deve inoltrare a un servlet asincrono è: Utilizzare <servlet>/<async-supported>true o @WebServlet(asyncSupported = true) per un servlet preelaborato; Utilizzare <servlet>/<async-supported>true per un jsp preelaborato Utilizzare <filter>/<async-supported>true o @WebFilter(asyncSupported = true) per un filtro preelaborato; Spero che questo possa aiutare un po '!

Problemi correlati