Spring REST описание файла утечки на multipart - PullRequest
0 голосов
/ 02 декабря 2019

Я обнаружил странное поведение Spring MVC (v5.0.3) при реализации из нескольких частей. Я взял самый простой пример из документа doc ( Spring doc 5.0.3 )

@PostMapping("/")
public String handle(@RequestPart("someTextParam") String someText,
        @RequestPart("myFile") MultipartFile file) {
    // ...
}

и запустил команду curl для отправки файла с такими параметрами:

curl -vvv -X POST http://localhost:88   -H 'authorization: Basic myPasEncrypted'   -H 'cache-control: no-cache'   -H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW'   -H 'postman-token: 0dce1583-5160-589d-3423-447e30157018'   -F 'front=@myFile copy.jpeg'  -F someTextParam=Mytext

И это работает, поэтому я могу получить ответ. Однако, если я проверю открытые файлы с помощью следующей команды:

lsof | grep myPID | grep tomcat | grep deleted | wc -l

я увижу 135. Это означает, что у нас есть 135 открытых файлов (фактически это тот же самый дескриптор, открытый в 135 потоках). Если я снова выполню команду curl, я получу 270.
Через 3-4 часа файлы все еще были открыты. Более того, если я выполню этот запрос 100 раз, я получу 13k + строк открытых файловых дескрипторов, которые никогда не будут закрыты, если приложение не будет остановлено.

Я проверил эти файлы, и все они соответствуют переменной someText что сводит меня с ума (все они содержат текст "Mytext"). Я ожидаю увидеть myFile, а не someText .

Я не вижу такого результата при использовании @RequestParam, однако он требует, чтобы я прочитал файл вручную (получить поток, прочитать, закрыть поток).

Также я потратил некоторое время на отладку иобнаружил, что если я использую @RequestPart, то он собирается AbstractMessageConverterMethodArgumentResolver.EmptyBodyCheckingHttpInputMessage , opens stream and never closed it. В то же время в случае @RequestParam он не входит внутрь этого класса и не пытается применять конвертеры.

Может кто-нибудь объяснить:

  1. Почему я вижу 135 потоков, ссылающихся на один и тот же файл?
  2. Почему Spring создает файлы для String переменных?
  3. Почему Spring удаляет файлы без закрытия потока?
...