Я пытаюсь загрузить большой файл в хранилище озера данных 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, однако я не уверен, почему это происходит, особенно если я использую поток, а не загружаю файл целиком, у кого-то была похожая проблема