IOException: поток закрыт при загрузке файлов на сервер

Мое приложение выдает эту ошибку при попытке загрузить любой файл:

java.io.IOException: Stream closed
        at java.base/java.io.PushbackInputStream.ensureOpen(PushbackInputStream.java:75)
        at java.base/java.io.PushbackInputStream.read(PushbackInputStream.java:163)
        at java.base/java.io.FilterInputStream.read(FilterInputStream.java:107)
        at com.google.common.io.ByteStreams.copy(ByteStreams.java:70)
        at com.google.common.io.ByteStreams.toByteArray(ByteStreams.java:115)
        at com.mycompany.backend.resource.impl.FileServerResource.createFile(FileServerResource.java:120)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at org.restlet.resource.ServerResource.doHandle(ServerResource.java:508)
        at org.restlet.resource.ServerResource.post(ServerResource.java:1341)
        at org.restlet.resource.ServerResource.doHandle(ServerResource.java:606)
        at org.restlet.resource.ServerResource.doNegotiatedHandle(ServerResource.java:662)
        at org.restlet.resource.ServerResource.doConditionalHandle(ServerResource.java:348)
        at org.restlet.resource.ServerResource.handle(ServerResource.java:1020)
        at org.restlet.resource.Finder.handle(Finder.java:236)
        at org.restlet.routing.Filter.doHandle(Filter.java:150)
        at org.restlet.routing.Filter.handle(Filter.java:197)
        at org.restlet.routing.Router.doHandle(Router.java:422)
        at org.restlet.routing.Router.handle(Router.java:641)
        at org.restlet.routing.Filter.doHandle(Filter.java:150)
        at org.restlet.routing.Filter.handle(Filter.java:197)
        at org.restlet.routing.Filter.doHandle(Filter.java:150)
        at org.restlet.routing.Filter.handle(Filter.java:197)
        at org.restlet.routing.Filter.doHandle(Filter.java:150)
        at org.restlet.routing.Filter.handle(Filter.java:197)
        at org.restlet.routing.Filter.doHandle(Filter.java:150)
        at org.restlet.routing.Filter.handle(Filter.java:197)
        at org.restlet.routing.Filter.doHandle(Filter.java:150)
        at org.restlet.routing.Filter.handle(Filter.java:197)
        at org.restlet.routing.Filter.doHandle(Filter.java:150)
        at org.restlet.engine.application.StatusFilter.doHandle(StatusFilter.java:140)
        at org.restlet.routing.Filter.handle(Filter.java:197)
        at org.restlet.routing.Filter.doHandle(Filter.java:150)
        at org.restlet.routing.Filter.handle(Filter.java:197)
        at org.restlet.engine.CompositeHelper.handle(CompositeHelper.java:202)
        at org.restlet.engine.application.ApplicationHelper.handle(ApplicationHelper.java:77)
        at org.restlet.Application.handle(Application.java:385)
        at org.restlet.routing.Filter.doHandle(Filter.java:150)
        at org.restlet.routing.Filter.handle(Filter.java:197)
        at org.restlet.routing.Router.doHandle(Router.java:422)
        at org.restlet.routing.Router.handle(Router.java:641)
        at org.restlet.routing.Filter.doHandle(Filter.java:150)
        at org.restlet.routing.Filter.handle(Filter.java:197)
        at org.restlet.routing.Router.doHandle(Router.java:422)
        at org.restlet.routing.Router.handle(Router.java:641)
        at org.restlet.routing.Filter.doHandle(Filter.java:150)
        at org.restlet.routing.Filter.handle(Filter.java:197)
        at org.restlet.engine.CompositeHelper.handle(CompositeHelper.java:202)
        at org.restlet.Component.handle(Component.java:408)
        at org.restlet.Server.handle(Server.java:507)
        at org.restlet.engine.connector.ServerHelper.handle(ServerHelper.java:63)
        at org.restlet.engine.adapter.HttpServerHelper.handle(HttpServerHelper.java:143)
        at org.restlet.ext.servlet.ServerServlet.service(ServerServlet.java:1117)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
        at nginx.unit.Context$ServletReg.service(Context.java:2011)
        at nginx.unit.Context$CtxFilterChain.doFilter(Context.java:750)
        at nginx.unit.Context.service(Context.java:971)

Проблема в значительной степени изолирована и возникает только на удаленном сервере с сервером NGINX + NGINX Unit. Запуск на локальном хосте/встроенном причале во время разработки не вызывает эту ошибку.

Код Java, который выдает эту ошибку:

@Override
public File createFile(Representation entity) {
      if (entity != null
          && MediaType.APPLICATION_OCTET_STREAM.equals(entity.getMediaType())) {
        InputStream inputStream = entity.getStream(); // <--- error thrown here
        File file = fileRepository.put(destinationFile, inputStream);
        setStatus(Status.SUCCESS_CREATED);
        return file;
      }
}

Как я могу отладить это с сервера NGINX, а также в приложении Java? Как я могу найти то, что преждевременно закрывает поток?

Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
Что такое управление транзакциями JDBC и как оно используется для поддержания согласованности данных?
Что такое управление транзакциями JDBC и как оно используется для поддержания согласованности данных?
Управление транзакциями JDBC - это мощная функция, которая позволяет рассматривать группу операций с базой данных как единую единицу работы. Оно...
Выполнение HTTP-запроса с помощью Spring WebClient: GET
Выполнение HTTP-запроса с помощью Spring WebClient: GET
WebClient - это реактивный веб-клиент, представленный в Spring 5. Это реактивное, неблокирующее решение, работающее по протоколу HTTP/1.1.
Gradle за прокси-сервером
Gradle за прокси-сервером
Создайте проект Gradle под сетевым прокси.
0
0
796
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Эта проблема возникает, когда NGINX proxy_pass закрывает соединение, поэтому, чтобы решить эту проблему, сделайте что-то вроде:

server { 
  location / { 
    proxy_pass http://upstream; 
    proxy_set_header Connection ""; 
    proxy_http_version 1.1; 
  } 
}

Установите proxy_set_header Connection ""

Другие вопросы по теме