Как отслеживать изменения файлов в приложении Java EE? - PullRequest
2 голосов
/ 19 декабря 2011

Существует ли переносимый способ мониторинга файла на предмет изменений из развернутого приложения?

В качестве практического примера предположим, что у меня есть приложение, развернутое в Glassfish AS. Затем, во время работы приложения, я развертываю файл конфигурации внутри / META-INF, который будет прочитан некоторым потоком из моего приложения.

Итак, как это реализовать? Как отслеживать файл (или каталог, в этом отношении) на предмет изменений?

Ответы [ 4 ]

3 голосов
/ 19 декабря 2011

Java7 имеет независимое от платформы решение для мониторинга файлов в файловой системе:

http://docs.oracle.com/javase/7/docs/api/java/nio/file/WatchService.html

Вот краткое руководство по его использованию:

http://docs.oracle.com/javase/tutorial/essential/io/notification.html

Но, как правильно сказал jtahlborn, если контейнер не взрывает файл .war, смотреть нечего.

1 голос
/ 19 декабря 2011

Загрузчики классов сильно кэшируются и ресурс при первом чтении больше не обновляется из базовой файловой системы.

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

1 голос
/ 19 декабря 2011

Я думаю, что было бы невозможно обеспечить такой механизм.Вы предполагаете, что "/ META-INF" находится в файловой системе, но я не верю, что существует какое-либо требование для приложения Java EE быть разорванным в файловой системе.(да, многие серверы приложений делают это по разным причинам, но я уверен, что это не является обязательным требованием).

0 голосов
/ 19 декабря 2011

Пожалуйста, проверьте ответ от @jtahlborn. Если у вас есть доступ к файловой системе, у вас есть два варианта:

  • Переносимый неэффективный способ состоит в том, чтобы периодически опрашивать файловую систему и проверять наличие изменений, проверяя дату изменения или CRC - файл (медленнее)

  • Эффективным способом является использование собственных функций ОС, чтобы получать уведомления при изменении файла. Проверьте libnotify . Однако для этого потребуются локальные собственные библиотеки.

...