Я обнаружил странное поведение 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
он не входит внутрь этого класса и не пытается применять конвертеры.
Может кто-нибудь объяснить:
- Почему я вижу 135 потоков, ссылающихся на один и тот же файл?
- Почему Spring создает файлы для
String
переменных? - Почему Spring удаляет файлы без закрытия потока?