EJB 3.1 и NIO2: мониторинг файловой системы
Я думаю, что большинство из нас согласны с тем, что NIO2 - это хорошая вещь для использования. Предполагается, что вы хотите отслеживать какую-то часть файловой системы на предмет наличия xml-файлов, теперь это простая задача. Но что, если я хочу интегрировать вещи в существующее приложение Java EE, чтобы мне не нужно было запускать другую службу (сервер приложений И тот, который контролирует файловую систему)? Итак, у меня есть тяжелый сервер приложений со всеми компонентами EJB 3.1 и какой-то службой, контролирующей файловую систему, и я предпринимаю соответствующие действия, как только появляется файл. Интересно, что подходящим действием является создание сообщения и его отправка с помощью JMS, и было бы неплохо интегрировать оба в сервер приложений.
Я попытался @Startup, но развертывание зависает (и я знаю, что я не должен использовать там ввод-вывод, это была просто попытка). Во всяком случае... какие-либо предложения?
2 ответа
Вы можете создать синглтон, который загружается при запуске и делегирует мониторинг асинхронному компоненту
@Singleton
@Startup
public class Initialiser {
@EJB
private FileSystemMonitor fileSystemMonitor;
@PostConstruct
public void init() {
String fileSystemPath = ....;
fileSystemMonitor.poll(fileSystemPath);
}
}
Тогда асинхронный компонент выглядит примерно так
@Stateless
public class FileSystemMonitor {
@Asynchronous
public void poll(String fileSystemPath) {
WatchService watcher = ....;
for (;;) {
WatchKey key = null;
try {
key = watcher.take();
for (WatchEvent<?> event: key.pollEvents()) {
WatchEvent.Kind<?> kind = event.kind();
if (kind == StandardWatchEventKinds.OVERFLOW) {
continue; // If events are lost or discarded
}
WatchEvent<Path> watchEvent = (WatchEvent<Path>)event;
//Process files....
}
} catch (InterruptedException e) {
e.printStackTrace();
return;
} finally {
if (key != null) {
boolean valid = key.reset();
if (!valid) break; // If the key is no longer valid, the directory is inaccessible so exit the loop.
}
}
}
}
}
Может помочь, если вы указали, какой сервер вы используете, но рассматривали ли вы возможность внедрения службы на основе JMX? Он немного более "нейтрален", чем EJB, больше подходит для фоновой службы и имеет меньше ограничений.