Java Spring4中的DeferredResult是否支持Servlet3.1(读写)侦听器?

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相关的任何信息 或者

我正在阅读关于使用Spring在Servlet上支持异步的文章

有趣的是:

如果您的服务预计会收到大量的请求或响应主体,特别是当客户端写或读速度较慢时,您将受益于使用Servlet 3.1中引入的非阻塞IO特性,如前所述。在ServletiInputStream上有一个方法setReadListener,您可以在其中设置ReadListener

我看到您可以使用
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);