web-dev-qa-db-ja.com

サーブレット3.0非同期サポートが機能しない

これが私のweb.xmlです

    <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とTomcat 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)

誰が私を助けてくれますか?どうもありがとう。

24
Ben

サーブレットとチェーン内の他のフィルターには<async-supported>true</async-supported> in web.xml。

51

私にも同様の問題がありましたが、私の場合、それだけでは不十分でした。タグコンテキストとバルブ(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>
5
Greca

再帰的にthis.doFilter(req, res, chain);を呼び出しています。

チェーンを継続する場合は、chain.doFilter(httpRequest, httpResponse);ではなくthis.doFilter(req, res, chain);を呼び出す必要があります。

4
Juan Ignacio

あなたはこのような非同期サーブレットをマッピングするための注釈を使用することができます

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

public class YourServlet extends HttpServlet { }
3
user3635339

ピーター・カラビノビッチ、あなたの答えは真実ではありません。サーブレット3.0仕様から:

2.3.3.3非同期処理
...
asyncSupported = trueのサーブレットから、asyncSupportedがfalseに設定されているサーブレットへのディスパッチはallowedです。この場合、非同期をサポートしないサーブレットのサービスメソッドが終了すると、応答がコミットされます...

2
Yury

これは古い投稿ですが、私の解決策を共有したいと思います。考えられるすべての解決策を試してみたため、原因を特定するのに1週間かかりました。

私にとって、サーブレットのURLパターンは正しくありませんでした。

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

それが何らかの役に立つことを願っています。

1
Java_User