java-Spring 4中的DeferredResult支持Servlet 3.1(Read | Write)Listener吗?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-Spring 4中的DeferredResult支持Servlet 3.1(Read | Write)Listener吗?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2939字,纯文字阅读大概需要5分钟。
内容图文
我正在阅读JayWay article关于Spring上Servlet的异步支持.
有趣的部分是:
If your service is expected to receive large request or response bodies, especially if the clients write or read slowly, you would benefit from using the non-blocking IO feature introduced in Servlet 3.1, as mentioned earlier. On the ServletInputStream there is the method setReadListener where you can set a ReadListener.
我看到您可以使用DeferredResult在异步启动Servlet方面做些事情,但是我找不到与ReadListener和WriteListener相关的任何信息.
或至少,我期望在这方面有所帮助,因为它在我的应用程序的边界上很友好,我只需要获取请求并发送结果即可.
解决方法:
是的,可以将ReadListeners与Spring的DeferredResult一起使用,我将在下面概述过程.我想象WriteListeners的过程是相似的.
启动异步处理
当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);
Tomcat,也许还有其他容器,也不允许这样做.他们对Servlet Spec的解释是,必须在允许附加ReadListener之前启动异步处理.因此,如果您希望应用程序与容器无关,建议使用以下技术.
创建一个DeferredResultProcessingInterceptor
Spring提供了一种使用DeferredResultProcessingInterceptors拦截异步请求处理的机制.创建拦截器,如下所示:
/**
* 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);
}
在Spring开始异步处理之后,但是在其他任何事情发生之前,preProcess方法将立即执行,这正是我们想要的.
DeferredResultProcessingInterceptor可以在控制器方法中附加到您的请求,如下所示:
DeferredResultProcessingInterceptor deferredResultInterceptor =
new NioDeferredResultInterceptor(request, deferredResult, modelMap);
WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
asyncManager.registerDeferredResultInterceptor("SomeKey", deferredResultInterceptor);
内容总结
以上是互联网集市为您收集整理的java-Spring 4中的DeferredResult支持Servlet 3.1(Read | Write)Listener吗?全部内容,希望文章能够帮你解决java-Spring 4中的DeferredResult支持Servlet 3.1(Read | Write)Listener吗?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。