これが私の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)
誰が私を助けてくれますか?どうもありがとう。
サーブレットとチェーン内の他のフィルターには<async-supported>true</async-supported>
in web.xml。
私にも同様の問題がありましたが、私の場合、それだけでは不十分でした。タグコンテキストとバルブ(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>
再帰的にthis.doFilter(req, res, chain);
を呼び出しています。
チェーンを継続する場合は、chain.doFilter(httpRequest, httpResponse);
ではなくthis.doFilter(req, res, chain);
を呼び出す必要があります。
あなたはこのような非同期サーブレットをマッピングするための注釈を使用することができます
@WebServlet(urlPatterns = {"/yourServlet"}, **asyncSupported=true**)
public class YourServlet extends HttpServlet { }
ピーター・カラビノビッチ、あなたの答えは真実ではありません。サーブレット3.0仕様から:
2.3.3.3非同期処理
...
asyncSupported = trueのサーブレットから、asyncSupportedがfalseに設定されているサーブレットへのディスパッチはallowedです。この場合、非同期をサポートしないサーブレットのサービスメソッドが終了すると、応答がコミットされます...
これは古い投稿ですが、私の解決策を共有したいと思います。考えられるすべての解決策を試してみたため、原因を特定するのに1週間かかりました。
私にとって、サーブレットのURLパターンは正しくありませんでした。
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/pattern/</url-pattern> <---
</servlet-mapping>
それが何らかの役に立つことを願っています。