HttpChannelOverHttp关闭后Jetty数据过多
我上传一个大于10秒的音频文件时遇到问题,并出现以下错误:HttpChannelOverHttp关闭后Jetty数据过多,jetty,Jetty,我上传一个大于10秒的音频文件时遇到问题,并出现以下错误: WARN:oejh.HttpParser:qtp1359061041-19: badMessage: java.lang.IllegalStateException: too much data after closed for HttpChannelOverHttp@7fd0cbe{r=5,a=IDLE,uri=-} 如果我上传音频文件,这听起来像是这里讨论的类似问题 你是怎么开始杰蒂的?日志信息从命令行发送到STOUT吗?如果是这
WARN:oejh.HttpParser:qtp1359061041-19: badMessage: java.lang.IllegalStateException: too much data after closed for HttpChannelOverHttp@7fd0cbe{r=5,a=IDLE,uri=-}
如果我上传音频文件,这听起来像是这里讨论的类似问题
你是怎么开始杰蒂的?日志信息从命令行发送到STOUT吗?如果是这样,您可能需要将应用程序作为服务启动,或者将日志级别配置得更低。要从init.d运行服务器,请将脚本${JETTY_HOME}/bin/JETTY.sh复制到/etc/init.d/文件夹(如果您希望在系统启动期间启动JETTY)。确保脚本具有执行权限。像这样运行脚本
sudo/etc/init.d/jetty start
(我已将jetty.sh复制为/etc/init.d/文件夹中的jetty)我使用的是Cordova 3.3.0,上传时出现了问题。下面的代码解决了我的问题:
var options = new FileUploadOptions();
options.fileKey="file";
options.fileName=name;
options.mimeType = "audio/amr";
options.headers = {
Connection: "close"
}
options.chunkedMode = false;
为什么jetty在关闭后不断给我太多数据(我会尽力解释)。在执行另一个连接和请求后,必须关闭连接。例如,我的上传一直重复使用相同的请求,请求溢出并给我消息。所以基本上,对于每个请求,必须关闭并打开新的请求
为了预防起见,我在jetty.xml
<Set name="outputBufferSize"><Property name="jetty.output.buffer.size" default="65536" /></Set>
<Set name="requestHeaderSize"><Property name="jetty.request.header.size" default="16384" /></Set>
<Set name="responseHeaderSize"><Property name="jetty.response.header.size" default="16384" /></Set>
在我的例子中,客户端发送的表单密钥比服务器允许接收的数量多
所以,我不得不设置
WebAppContext webapp = new WebAppContext();
webapp.getServletContext().getContextHandler().setMaxFormKeys(1000000000);
在jetty服务器端。对于谷歌,我遇到了这个问题,通过将参数注释从@FormParam
更改为@FormDataParam
,解决了这个问题:
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response post(
@FormParam("name") String name,
@FormParam("file") InputStream file) {
//...
}
致:
我在Heroku上运行,偶然发现了解决方案,发现了以下文档:
上面说:
此注释与媒体类型“多部分/表单数据”一起用于提交和使用包含文件、非ASCII数据和二进制数据的表单
对我来说,问题是我没有阅读输入。并非每次都会触发错误,但当输入超过一定大小时,就会发生这些错误。在写入输出流之前,简单地完全读取输入流就解决了这个问题。我正在启动服务器java-jar start.jar
尝试将其作为一个进程运行,或者将标准重定向到/dev/null(假设linux)。它对我不起作用,我正在以小于1mb的15秒的速度传递文件,但仍然给出相同的错误。我正在运行一个rest服务,它使用上述命令在Jetty上接受数据。我可以轻松上传100MB。文件上载到哪里?在我的本地文件夹中运行Jetty的应用程序(我假设它是你的应用程序)可能是错误的:/home/ubuntu/fileupload
,但是当显示这个错误时,它确实是随机的,有15秒的音频,有时有效,有时无效。实际上,我说的是错误的。它没有在我的rest服务上调用任何方法。
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response post(
@FormDataParam("name") String name,
@FormDataParam("file") InputStream file) {
//...
}