Java Spring4中的DeferredResult是否支持Servlet3.1(读写)侦听器?
我正在阅读关于使用Spring在Servlet上支持异步的文章 有趣的是: 如果您的服务预计会收到大量的请求或响应主体,特别是当客户端写或读速度较慢时,您将受益于使用Servlet 3.1中引入的非阻塞IO特性,如前所述。在ServletiInputStream上有一个方法setReadListener,您可以在其中设置ReadListener 我看到您可以使用Java Spring4中的DeferredResult是否支持Servlet3.1(读写)侦听器?,java,spring,spring-mvc,servlets,Java,Spring,Spring Mvc,Servlets,我正在阅读关于使用Spring在Servlet上支持异步的文章 有趣的是: 如果您的服务预计会收到大量的请求或响应主体,特别是当客户端写或读速度较慢时,您将受益于使用Servlet 3.1中引入的非阻塞IO特性,如前所述。在ServletiInputStream上有一个方法setReadListener,您可以在其中设置ReadListener 我看到您可以使用DeferredResult异步启动servlet,但我找不到与ReadListener和WriteListener相关的任何信息 或者
DeferredResult
异步启动servlet,但我找不到与ReadListener
和WriteListener
相关的任何信息
或者至少,我在这方面有所期待,因为它在我的应用程序的边界上,我只需要获得请求并发送结果。是的,可以将ReadListeners与Spring的延迟结果一起使用,我将在下面概述该过程。我想写听者的过程是类似的 启动异步处理 当Spring将DeferredResult视为返回类型时,WebAsyncManager将在方法执行后调用request.startAsync()。这将以异步模式启动请求处理。重要的是,不要在控制器方法中手动启动异步处理,Spring无法处理已经启动的异步处理,异常将被抛出 附加您的ReadListener 这将因容器而异。Jetty将允许您在异步处理开始之前,将readListener附加到控制器方法中的ServletInputStream,如下所示:
DeferredResult<String> deferredResult = new DeferredResult<String>();
ReadListener readListener = new NioReadListener(request, deferredResult, modelMap);
ServletInputStream stream = request.getInputStream();
stream.setReadListener(readListener);
/**
* Responsible for attaching a {@link NioReadListener} to the servlet input stream before async processing begins.
*/
public class NioDeferredResultInterceptor extends DeferredResultProcessingInterceptorAdapter {
private final DeferredResult<String> _deferredResult;
private final VaultServletRequest _request;
private final ModelMap _model;
public NioDeferredResultInterceptor(ServletRequest request, DeferredResult<String> deferredResult, ModelMap model) {
_deferredResult = deferredResult;
_request = request;
_model = model;
}
@Override
public <T> void preProcess(NativeWebRequest request, DeferredResult<T> deferredResult) throws Exception {
ReadListener readListener = new NioReadListener(_request, _deferredResult, _model);
ServletInputStream servletInputStream = _request.getInputStream();
servletInputStream.setReadListener(readListener);
}
DeferredResultProcessingInterceptor deferredResultInterceptor =
new NioDeferredResultInterceptor(request, deferredResult, modelMap);
WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
asyncManager.registerDeferredResultInterceptor("SomeKey", deferredResultInterceptor);