IllegalStateException: не поддерживается в AsyncContext.startAsync (req, res)


Я создал сервлет 3.0 для изучения асинхронной обработки запросов:

@WebServlet(name="MyTest", urlPatterns={"/MyTest"}, asyncSupported=true)
public class MyTest extends HttpServlet {

    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {

        AsyncContext tmp = req.startAsync(req, res);
        ...

    }    

}
Но я получаю IllegalStateException, когда вызывается .startAsync(...). Я знаю, что Javadoc упоминает это исключение, но я явно включил async (C.f. WebServlet аннотацию). Я использую Tomcat 7.0.11.0, поставляемый с NetBeans.

Я могу подтвердить, что req.isAsyncSupported() возвращает false. Что я делаю не так? Что еще нужно сделать, чтобы включить асинхронную обработку?

Редактировать:

Я попытался реализовать следующий пример и получил тот же вопрос.

2 13

2 ответа:

Я проверил код Tomcat и увидел, что переменная asyncSupported должна быть явно установлена в true. Вот почему вы получаете req.isAsyncSupported() == false.

Можно попытаться установить атрибут async в объекте HttpServletRequest в значение true одним из следующих методов.

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

Или

((org.apache.catalina.connector.Request)req).setAsyncSupported(true);

Надеюсь, что это помогает.

Пожалуйста, проверьте, есть ли у вас фильтр запросов, который не поддерживает асинхронность. Вы можете либо удалить фильтр (временно), либо пометить его для поддержки асинхронности.