开发者社区> 问答> 正文

Jetty环境下部署fileserver,下载大文件?报错

我用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>

 

展开
收起
爱吃鱼的程序员 2020-06-08 15:03:50 1053 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    报错是因为jetty在处理你得servlet时,由于文件大,加载时间长,SharedBlockingCallback这个类检测到你这个servlet类占用锁时间太长就给你丢了一个超时异常。解决办法也简单,设置超时时间就可以了,但不建议用jetty做文件服务器,最好用专门的文件服务器,不然几个人同时下载你得网站就完蛋了

     

    嗯,已经解决了,就是设置超时时间。http.timeout就可以了只是做一个简单内嵌fileserver,不做为网站使用

    大文件可以拆分成小文件下载啊,然后分到不同机器,这样单个server的负载就小了,然后再优化超时和调度
    2020-06-08 15:04:01
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载