2010-11-05 2 views
22

Вот мой web.xmlServlet 3.0 Асинхронный при поддержке не работает

<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, а также на котом 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) 

Кто может помочь мне это? большое спасибо.

+0

показать весь web.xml (по крайней мере, определение тега '' с пространством имен) – Bozho

ответ

45

Поскольку ваш сервлет и любой другой фильтр в цепи должны иметь <async-supported>true</async-supported> в web.xml.

+0

как это сделать с аннотацией? – necromancer

+6

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

4

Вы вызываете рекурсивно this.doFilter(req, res, chain);.

Если вы хотите продолжить цепочку, вы должны вызывать chain.doFilter(httpRequest, httpResponse); вместо this.doFilter(req, res, chain);.

4

У меня была аналогичная проблема, но в моем случае этого было недостаточно. Если вы используете теги 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> 
0

Я знаю это старое сообщение, но я хотел бы поделиться своим решением. Мне потребовалось 1 неделя, чтобы выяснить причину, потому что я пытался почти попробовать все возможные решения.

Для меня неправильный шаблон URL сервлета.

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

Надеюсь, это будет полезно.

2

Питер Карабинович, вы отвечаете неправдой. От Servlet 3.0 спецификации:

2.3.3.3 Асинхронный обработки
...
диспетчеризацию из сервлета, который asyncSupported = верен той, где asyncSupported установлено значение ЛОЖЬ разрешено. В этом случае ответ будет совершено, когда метод обслуживания сервлета, который не поддерживает асинхронный вышел ...

3

Вы можете использовать аннотацию для сопоставления Асинхронный Servlet, как это

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

public class YourServlet extends HttpServlet { } 
Смежные вопросы