Потоковая передача файла в веб-приложение Azure останавливается на 2 Go: SocketTimeoutException - PullRequest
2 голосов
/ 04 июля 2019

Я пытаюсь загрузить большой файл в хранилище озера данных Azure, однако загрузка останавливается каждый раз при 2 Go. Я загружаю файл с помощью потока из своего сообщения в веб-приложение Azure, а затем в хранилище озера данных Azure. Вот шаги, которые я сделал для устранения проблемы:

Сначала я запускаю приложение локально, так что мой локальный компьютер является сервером, в этом случае файл передается в Azure Data Lake правильно, однако при развертывании приложения в Azure Web приложение загружается только 2Go, и оно останавливается там, логи не показывают много, вот что я получил:

java.net.SocketTimeoutException: null
    at org.apache.tomcat.util.net.NioBlockingSelector.read(NioBlockingSelector.java:201) ~[tomcat-coyote.jar:8.5.37]
    at org.apache.tomcat.util.net.NioSelectorPool.read(NioSelectorPool.java:235) ~[tomcat-coyote.jar:8.5.37]
    at org.apache.tomcat.util.net.NioSelectorPool.read(NioSelectorPool.java:216) ~[tomcat-coyote.jar:8.5.37]
    at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1280) ~[tomcat-coyote.jar:8.5.37]
    at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1223) ~[tomcat-coyote.jar:8.5.37]
    at org.apache.coyote.http11.Http11InputBuffer.fill(Http11InputBuffer.java:729) ~[tomcat-coyote.jar:8.5.37]
    at org.apache.coyote.http11.Http11InputBuffer.access$300(Http11InputBuffer.java:40) ~[tomcat-coyote.jar:8.5.37]
    at org.apache.coyote.http11.Http11InputBuffer$SocketInputBuffer.doRead(Http11InputBuffer.java:1084) ~[tomcat-coyote.jar:8.5.37]
    at org.apache.coyote.http11.filters.IdentityInputFilter.doRead(IdentityInputFilter.java:140) ~[tomcat-coyote.jar:8.5.37]
    at org.apache.coyote.http11.Http11InputBuffer.doRead(Http11InputBuffer.java:263) ~[tomcat-coyote.jar:8.5.37]
    at org.apache.coyote.Request.doRead(Request.java:581) ~[tomcat-coyote.jar:8.5.37]
    at org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:343) ~[catalina.jar:8.5.37]
    at org.apache.catalina.connector.InputBuffer.checkByteBufferEof(InputBuffer.java:659) ~[catalina.jar:8.5.37]
    at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:366) ~[catalina.jar:8.5.37]
    at org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:183) ~[catalina.jar:8.5.37]
    at org.apache.tomcat.util.http.fileupload.MultipartStream$ItemInputStream.makeAvailable(MultipartStream.java:977) ~[tomcat-coyote.jar:8.5.37]
    at org.apache.tomcat.util.http.fileupload.MultipartStream$ItemInputStream.close(MultipartStream.java:921) ~[tomcat-coyote.jar:8.5.37]
    at org.apache.tomcat.util.http.fileupload.MultipartStream$ItemInputStream.close(MultipartStream.java:900) ~[tomcat-coyote.jar:8.5.37]
    at org.apache.tomcat.util.http.fileupload.FileUploadBase$FileItemIteratorImpl$FileItemStreamImpl.close(FileUploadBase.java:708) ~[tomcat-coyote.jar:8.5.37]
    at org.apache.tomcat.util.http.fileupload.FileUploadBase$FileItemIteratorImpl.findNextItem(FileUploadBase.java:859) ~[tomcat-coyote.jar:8.5.37]
    at org.apache.tomcat.util.http.fileupload.FileUploadBase$FileItemIteratorImpl.hasNext(FileUploadBase.java:949) ~[tomcat-coyote.jar:8.5.37]
    at com.upload.upload.UploadController.handleUpload(UploadController.java:42) [classes/:0.0.1-SNAPSHOT]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_181]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_181]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_181]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_181]

Мой код: Пружинная загрузка:

@PostMapping("/upload")
    public ResponseEntity handleUpload(HttpServletRequest request) throws Exception {
        log.info("UploadController started !");
        try {
            ServletFileUpload upload = new ServletFileUpload();
            FileItemIterator iterStream = upload.getItemIterator(request);
            while (iterStream.hasNext()) {
                FileItemStream item = iterStream.next();
                String name = item.getName();
                InputStream stream = item.openStream();
                if (!item.isFormField()) {
                    log.info("file is being streamed");
                    copyStreamToAzure(stream, getUploadPath() + "/" + name);
                    //convertInputStreamToFileNio(stream, name);
                } else {
                    String formFieldValue = Streams.asString(stream);
                }
            }
        } catch (Exception e) {
            log.error(e.getMessage());
            log.error("failed!", e);
            return new ResponseEntity<>(e.getMessage(), HttpStatus.BAD_REQUEST);
        }
        return new ResponseEntity<>("Fichier téléchargé avec succès.", HttpStatus.OK);
    }

application.properties:

server.port=9001
spring.servlet.multipart.max-file-size=-1
spring.servlet.multipart.max-request-size=-1
spring.servlet.multipart.enabled=false
server.connection-timeout=10000s
server.max-http-header-size=10000000

Этот web.config в веб-приложении:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

   <system.web>
      <httpRuntime maxRequestLength="4294967295" executionTimeout="3000000"/>
   </system.web>

   <system.webServer>
      <security>
         <requestFiltering>
            <requestLimits maxAllowedContentLength="4294967295" />
         </requestFiltering>
      </security>
      <httpPlatform processPath="%AZURE_TOMCAT85_HOME%\bin\startup.bat" arguments="-config D:\home\site\wwwroot\conf\server.xml start"> 
         <environmentVariables>
            <environmentVariable name="CATALINA_OPTS" value="-Dport.http=%HTTP_PLATFORM_PORT% -Xms512m -Xmx2048m" />
            <environmentVariable name="CATALINA_HOME" value="%AZURE_TOMCAT85_HOME%" />
         </environmentVariables>
      </httpPlatform>
   </system.webServer>

</configuration>

Это server.xml:

    ...
< Connector port="${port.http}" protocol="HTTP/1.1" address="127.0.0.1" URIEncoding="UTF-8"
               connectionTimeout="6000000"
               maxHttpHeaderSize="16384"
               redirectPort="8443"
               connectionUploadTimeout="36000000" disableUploadTimeout="false"/>
    ...

На данный момент очевидно, что проблема в веб-приложении Azure, однако я не уверен, почему это происходит, особенно если я использую поток, а не загружаю файл целиком, у кого-то была похожая проблема

...