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, больше подходит для фоновой службы и имеет меньше ограничений.

Другие вопросы по тегам