我正在使用Spring的
OncePerRequestFilter
,覆盖shouldNotFilterAsyncDispatch
方法并返回false。这样它就可以处理异步请求。在过滤器中,我尝试执行以下操作:if (isAsyncDispatch(request)) {
request.getAsyncContext().addListener(new AsyncListener() {
@Override
public void onComplete(AsyncEvent event) throws IOException {
System.out.println("onComplete");
}
@Override
public void onTimeout(AsyncEvent event) throws IOException {
}
@Override
public void onError(AsyncEvent event) throws IOException {
System.out.println("onError");
}
@Override
public void onStartAsync(AsyncEvent event) throws IOException {
}
});
}
所以isAsyncDispatch
返回了预期的true。但是当我尝试使用getAsyncContext
时,会出现以下异常:
IllegalStateException: It is illegal to call this method if the current request is not in asynchronous mode (i.e. isAsyncStarted() returns false)
实际上,request.isAsyncStarted()
返回false,但是request.isAsyncSupported()
为true,并且request.getDispatcherType()
为ASYNC
。
我不明白:它是异步的还是不是?也许我在错误地使用API?如何添加AsyncListener
?也许是因为我正在使用Tomcat?
提前感谢!
startAsync()
方法还没有被调用。 - Adam Hošek