Итак, у меня есть файловый сервер Samba, на котором моему Java-приложению нужно написать некоторые файлы. Дело в том, что есть еще одно приложение php (если скрипт php даже считается приложением), который агрессивно вытаскивает один и тот же каталог для новых файлов.Заблокировать будущий файл
Иногда скрипт php вытаскивает файл до того, как приложение Java будет полностью записывать его на диск. Вот немного ASCII Art, чтобы помочь визуализировать то, что я в настоящее время (но не работает): доля
Samba
/foo
(мой Java приложение падает файл здесь)
/bar
(каталог, который вытаскивает php)
Что я сейчас делаю, когда файл соответствует некоторым критериям, он перемещается в /bar
, а затем подбирается php для большей обработки. Я пробовал другое дело, поэтому у меня был файл, который нельзя записывать и не читать, перед тем как позвонить renameTo
.
Я немного искал FileLock
, но, похоже, он не может блокировать будущие файлы. Поэтому мне интересно, какие возможности у меня есть здесь? Что я мог бы использовать, чтобы заблокировать файл от того, чтобы быть поднятым до того, как он полностью написан, не касаясь php (потому что, ну, это php, и я действительно не имею права изменять его прямо сейчас).
Благодаря
Edit 1
У меня есть некоторое представление о том, что сценарий PHP действительно делает, если это может помочь в любом случае.
Он читает файл каталога в цикле (используя readdir без сна).
Как только он находит имя файла, отличное от "." и «..», он называет file_get_contents и где это терпит неудачу, потому что файл не полностью записаны на диск (или даже не существует, так как код Java может даже не успел написать его между readdir
и file_get_contents
.
Edit 2
Это приложение Java заменяет старый PHP скрипт. Когда они реализовали его, они же проблема, у меня прямо сейчас. они решили, написав новый файл в /bar/tmp
(с file_put_contents
) и затем используйте rename, чтобы переместить его в бар (похоже, что переименование должно быть атомарным). И он работает нормально до сих пор. Я не могу и не буду верить t Java не может сделать что-то лучше, чем то, что php делает ...
Есть/foo и/bar в одной файловой системе? – rob
@rob Да, они есть. – ALOToverflow