赞
踩
最近在写文件的下载服务,主要功能是将请求URL调用业务接口进行解析,解析到真实的下载地址,然后将下载流透传出去。这一部分之前使用nginx-lua实现,由于维护过于困难(优雅上下线、截流、熔断能力缺乏, 证书相关运维支持缺失),因此改用Java实现。本文也主要论述如何依赖Jetty实现流转发功能。由于对Jetty的依赖非常深,建议使用EmbeddedJettyServer以引入和统一Jetty依赖。
首先,需要在HttpServletRequest中开启异步支持,如果不开启异步支持,会造成请求提前被返回引起流中断(servlet-api 3.1.0版本以上支持此功能)。
private void startAsync(HttpServletRequest request) {
AsyncContext asyncContext = request.startAsync();
// 异步任务设为不会超时
asyncContext.setTimeout(0);
}
之后,我们需要了解Jetty是如何写入Http响应体的,我们能不能调用Jetty的方法异步写入Http响应体。
最直接的想法就是查看一下servlet-api中的javax.servlet.ServletOutputStream的实现类,有没有相关异步写入的方法。
通过代码阅读,很容易就可以找到javax.servlet.ServletOutputStream的实现类,也就是我们的主角org.eclipse.jetty.server.HttpOutput。
它身上有以下AIO相关的方法(仅截取三个关心的方法):
/**
* Asynchronous send of whole content.
*
* @param content The whole content to send
* @param callback The callback to use to notify success or failure
*/
public void sendCon
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。