我用jetty部署了fileserver,然后下载大文件,小文件可顺利下载。大文件,比如450M的文件只能下载100多M,就不可以了,程序会阻塞到read函数的地方。java下载程序为:
private static final String URL = "http://127.0.0.1:8080/fileserver2/ID:ZJJ-WCDL2-PC-61788-1493276945467-1:1:1:1:1";
public static void main(String[] args) throws IOException, InterruptedException {
URL url = new URL(URL);
InputStream inStr =url.openStream();
String filePath = "f:/share/Win2K_SP4_Pro_Update.iso";
File file = new File(filePath);
FileOutputStream fos = new FileOutputStream(file);
byte[] block = new byte[1024*10];// 大小不同,文件就可能损坏。
int readLength=0;
long bytesWritten = 0;
while (true) {
System.out.println("read ..........");
readLength = inStr.read(block);
System.out.println("read .........."+readLength);
if (readLength == -1)
{
System.out.println("readLength ... break...."+readLength);
break;// end of file
}
fos.write(block, 0, readLength); // 一定要写入实际读取内容
bytesWritten += readLength;
System.out.println("bytesWritten...." +bytesWritten);
}
fos.flush();
fos.close();
}
服务器上jetty报错信息为:
java.io.IOException: org.eclipse.jetty.util.SharedBlockingCallback$BlockerTimeou
tException
at org.eclipse.jetty.util.SharedBlockingCallback$Blocker.block(SharedBlo
ckingCallback.java:213)
at org.eclipse.jetty.server.HttpOutput.sendContent(HttpOutput.java:585)
at org.eclipse.jetty.servlet.DefaultServlet.sendData(DefaultServlet.java
:960)
at org.eclipse.jetty.servlet.DefaultServlet.doGet(DefaultServlet.java:53
4)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:812
)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(Servlet
Handler.java:1669)
at org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter.doFilter(We
bSocketUpgradeFilter.java:201)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(Servlet
Handler.java:1652)
at com.cvicse.inforbroker.util.RestFilter.doFilter(RestFilter.java:92)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(Servlet
Handler.java:1652)
at com.cvicse.inforbroker.util.FilenameGuardFilter.doFilter(FilenameGuar
dFilter.java:50)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(Servlet
Handler.java:1652)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java
:585)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.j
ava:143)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.jav
a:577)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandl
er.java:223)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandl
er.java:1127)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:
515)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandle
r.java:185)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandle
r.java:1061)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.j
ava:141)
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(Cont
extHandlerCollection.java:215)
at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerColl
ection.java:110)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper
.java:97)
at org.eclipse.jetty.server.Server.handle(Server.java:499)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:311)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.jav
a:258)
at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java
:544)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPoo
l.java:635)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool
.java:555)
at java.lang.Thread.run(Unknown Source)
看错误是超时了,但是不知道应该修改哪个地方。附上web.xml配置文件:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>RESTful file access application</display-name>
<filter>
<filter-name>RestFilter</filter-name>
<filter-class>com.cvicse.inforbroker.util.RestFilter</filter-class>
</filter>
<filter>
<filter-name>FilenameGuardFilter</filter-name>
<filter-class>com.cvicse.inforbroker.util.FilenameGuardFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>FilenameGuardFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>RestFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>DefaultServlet</servlet-name>
<servlet-class>org.eclipse.jetty.servlet.DefaultServlet</servlet-class>
<init-param>
<param-name>pathInfoOnly</param-name> <!-- this should be set -->
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DefaultServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
报错是因为jetty在处理你得servlet时,由于文件大,加载时间长,SharedBlockingCallback这个类检测到你这个servlet类占用锁时间太长就给你丢了一个超时异常。解决办法也简单,设置超时时间就可以了,但不建议用jetty做文件服务器,最好用专门的文件服务器,不然几个人同时下载你得网站就完蛋了
嗯,已经解决了,就是设置超时时间。http.timeout就可以了只是做一个简单内嵌fileserver,不做为网站使用
大文件可以拆分成小文件下载啊,然后分到不同机器,这样单个server的负载就小了,然后再优化超时和调度版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。