Как определить, завершен ли файл в хранилище файлов Azure на Java?

В нашем проекте мы используем хранилище файлов Azure, в которое могут быть загружены большие файлы (не более 500 МБ), которые должны обрабатываться микросервисами Java (на основе Spring Boot) с использованием пакета SDK Azure для Java, который периодически опрашивает каталог для посмотреть, были ли загружены новые файлы. Возможно ли каким-то образом определить, когда загруженный файл полностью загружен, без очевидных решений, таких как мониторинг размера?


person apetrelli    schedule 04.05.2020    source источник
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)


К сожалению, невозможно напрямую отслеживать, когда загрузка файла была завершена (включая мониторинг размера). Это связано с тем, что загрузка файла происходит в два этапа:

  1. Сначала создается пустой файл определенного размера. Это соответствует операции Create File REST API.
  2. Затем содержимое записывается в этот файл. Это соответствует операции Put Range REST API. Здесь фактические данные записываются в файл.

Предполагая, что данные записываются в файл в последовательном порядке (т. Е. От байта 0 до размера файла), можно было бы продолжать проверять последнее "n" байтов файла и видеть, все ли они ненулевые байты. Это будет означать, что некоторые данные были записаны в конец файла. Опять же, это не надежное решение, так как может быть случай, когда последние «n» байтов действительно равны нулю.

person Gaurav Mantri    schedule 05.05.2020
comment
Спасибо, это было то, что я изначально предполагал. Пока я поддерживаю ваше решение, я приму его позже на этой неделе. - person apetrelli; 05.05.2020
comment
Пожалуйста. Не торопитесь с ответом :). Кто-то может предложить лучшее решение. - person Gaurav Mantri; 05.05.2020
comment
@apetrelli Как узнать, не записывает ли файл REST API в этот момент? Можем ли мы проверить статус блокировки? Один из способов - проверить, не меняются ли size и lastModifiedAt с 3-5 секунд, не будучи уверенным, что все время правильно. - person Gautam Kumar Samal; 10.06.2021
comment
Я понимаю, что вы имели в виду, проверяя последние n байтов на ноль. Есть ли способ сделать это без потоковой передачи всего контента, например, ReadRange (start, end)? - person Gautam Kumar Samal; 10.06.2021
comment
@GautamKumarSamal система прозрачна для нас. В конце, однако, мы заметили, что система передает файл со случайным именем и переименовывает его в его окончательную форму только после того, как весь файл был передан, поэтому мы использовали этот механизм, чтобы понять, когда файл будет завершен. Однако это поведение привязано к конкретному загрузчику и не является универсальным. - person apetrelli; 15.06.2021