В нашем проекте мы используем хранилище файлов Azure, в которое могут быть загружены большие файлы (не более 500 МБ), которые должны обрабатываться микросервисами Java (на основе Spring Boot) с использованием пакета SDK Azure для Java, который периодически опрашивает каталог для посмотреть, были ли загружены новые файлы. Возможно ли каким-то образом определить, когда загруженный файл полностью загружен, без очевидных решений, таких как мониторинг размера?
Как определить, завершен ли файл в хранилище файлов Azure на Java?
comment
Есть ли причина, по которой вы используете хранилище файлов, а не хранилище BLOB-объектов?
- person Gaurav Mantri   schedule 04.05.2020
comment
Вы можете использовать алгоритм хеширования и хэши (sha1, md5 и т. Д.) Для определения полноты файла.
- person ControlAltDel   schedule 04.05.2020
comment
Устаревший доступ @ GauravMantri-AIS, я обязан использовать его, потому что другая система сбрасывает туда файлы.
- person apetrelli   schedule 05.05.2020
comment
@ControlAltDel, к сожалению, это не та вещь, которую я могу контролировать, файл помещен другой системой.
- person apetrelli   schedule 05.05.2020
Ответы (1)
К сожалению, невозможно напрямую отслеживать, когда загрузка файла была завершена (включая мониторинг размера). Это связано с тем, что загрузка файла происходит в два этапа:
- Сначала создается пустой файл определенного размера. Это соответствует операции
Create File
REST API. - Затем содержимое записывается в этот файл. Это соответствует операции
Put Range
REST API. Здесь фактические данные записываются в файл.
Предполагая, что данные записываются в файл в последовательном порядке (т. Е. От байта 0 до размера файла), можно было бы продолжать проверять последнее "n" байтов файла и видеть, все ли они ненулевые байты. Это будет означать, что некоторые данные были записаны в конец файла. Опять же, это не надежное решение, так как может быть случай, когда последние «n» байтов действительно равны нулю.
person
Gaurav Mantri
schedule
05.05.2020
Спасибо, это было то, что я изначально предполагал. Пока я поддерживаю ваше решение, я приму его позже на этой неделе.
- person apetrelli; 05.05.2020
Пожалуйста. Не торопитесь с ответом :). Кто-то может предложить лучшее решение.
- person Gaurav Mantri; 05.05.2020
@apetrelli Как узнать, не записывает ли файл REST API в этот момент? Можем ли мы проверить статус блокировки? Один из способов - проверить, не меняются ли size и lastModifiedAt с 3-5 секунд, не будучи уверенным, что все время правильно.
- person Gautam Kumar Samal; 10.06.2021
Я понимаю, что вы имели в виду, проверяя последние n байтов на ноль. Есть ли способ сделать это без потоковой передачи всего контента, например, ReadRange (start, end)?
- person Gautam Kumar Samal; 10.06.2021
@GautamKumarSamal система прозрачна для нас. В конце, однако, мы заметили, что система передает файл со случайным именем и переименовывает его в его окончательную форму только после того, как весь файл был передан, поэтому мы использовали этот механизм, чтобы понять, когда файл будет завершен. Однако это поведение привязано к конкретному загрузчику и не является универсальным.
- person apetrelli; 15.06.2021