Мое требование - прочитать внешний файл из онлайн-приложения и обновить некоторые статические переменные. Так как мне 1.6 и довольно старый EJB-проект, я не думаю, что у меня есть много доступных вариантов. Итак, я подумал о создании нового слушателя с использованием ServletContextListener и последующем запуске демона, который будет смотреть на указанный внешний файл (используя абсолютный путь) для загрузки значений из него.
Для мониторинга я подумываю использовать Apache Common VFS или просто написать собственный опрос потоков, чтобы проверить последний измененный атрибут файла и перечитывать каждый раз, когда он изменяется.
Но я не уверен, что эти два подхода - лучший способ сделать это. Ниже приведен фрагмент кода, который будет выполнять чтение-
Пользовательский опрос потоков, о котором я думаю, приведен ниже.
final File file = new File(myConfigAbsolutePath);
long prevModTime = 0;
while (monitorActive) { //boolean variable
if (prevModTime != file.lastModified()) {
//read from File here and set variables
prevModTime=file.lastModified();
Thread.sleep(5000);
}
}
Кроме этого, я думаю о чем-то вроде -
FileAlterationObserver observer = new FileAlterationObserver(myFileDir);
FileAlterationMonitor monitor = new FileAlterationMonitor(5000);
FileAlterationListener listener = new FileAlterationListenerAdaptor() {
@Override
public void onFileCreate(File file) {
//code here
}
@Override
public void onFileDelete(File file) {
//code here
}
};
observer.addListener(listener);
monitor.addObserver(observer);
monitor.start();
Или VFS, как упомянуто здесь в ответе (https://stackoverflow.com/a/32331175/6751600)
FileSystemManager fsManager = VFS.getManager();
FileObject listenDir = fsManager.resolveFile(fileToCheck);
DefaultFileMonitor fm = new DefaultFileMonitor(new CustomFileListener());
fm.setRecursive(true);
fm.addFile(listenDir);
fm.start();
Все 3 подхода работают при инициализации через демон, но меня беспокоит, есть ли лучший способ сделать это в онлайн-приложении?
Мои требования - просто продолжать проверять, изменился ли файл, а затем перезагрузить переменные, прочитав файл. Мне нужен совет, какой из этих трех вариантов лучше подходит для онлайн-приложения, и если есть лучший способ добиться этого, то как это можно сделать.
Я заметил, что takeService take () выглядел хорошо, но, похоже, он доступен только в 1.7, а не в 1.6. Есть ли какой-нибудь пакет или что-то, что может позволить мне добавить необходимые классы для WatchService, чтобы каким-то образом включить его в 1.6? Я не настолько опытный разработчик, чтобы знать, возможно ли это вообще, и, наверное, думаю, это было бы невозможно, потому что 1.7 «каким-то образом» слушает события ОС, которые могут быть невозможны в 1.6.
Примечание. В коде могут быть синтаксические ошибки, я их скопировал и / или записал со своего мобильного телефона.