понедельник, 16 июля 2018 г.

Взаимодействие между приложениями и Watch Service

Взаимодействие между разными приложениями Java можно сделать с помощью файловой системы, базы данных и JMS. Рассмотрим случай ФС - в Java SE 7 появился новый и очень интересный механизм отслеживания изменений файловой системы в заданном каталоге - так называемый Watch Service, позволяющий остлеживать события создания / удаления / изменения файлов в реальном времени. То есть вы можете например создать каталоги /tmp/tasks/task1, /tmp/tasks/task2 и тогда к примеру одно приложение будет вносить в эти каталоги какие-либо изменения - а другое приложение будет отслеживать эти изменения в real-time и в зависимости от каталога и характера изменений запускать соответствующие задачи. Вот метод из десктопного проекта с использованием Spring, который работает в отдельном потоке от основного и отслеживает изменения в каталоге /tmp/tasks/task1 и когда вы руками (вместо другого приложения:)) кладете / удаляете файл в /tmp/tasks/task1 - выводится соответствующее сообщение.
// async-метод для получения задач
@Async // СКАНИРУЕМ НА НОВОЕ ЗАДАНИЕ в отдельном потоке
public void receiveTaskChecker() {
  try {
    WatchService watcher = FileSystems.getDefault().newWatchService();
   // сканируем на изменения соотв каталог для задачи номер 1:
    Path dir = FileSystems.getDefault().getPath("/tmp/tasks/task1");
    WatchKey key = dir.register(watcher,    
             StandardWatchEventKinds.ENTRY_CREATE, 
             StandardWatchEventKinds.ENTRY_DELETE);
   // Экземпляры WatchKey  потокобезопасны.
   while (true) {
      key = watcher.take(); // блокирует поток пока не появится событие
      // есть также неблокирующий способ получения key:
     //key = watcher.poll(5, TimeUnit.SECONDS);
     for (WatchEvent<?> event : key.pollEvents()) {
        if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) {
            // запускаем выполнение нужной задачи
            System.out.println("File task created \n");
        }
        if (event.kind() == StandardWatchEventKinds.ENTRY_DELETE) {
            // запускаем выполнение нужной задачи
            System.out.println("File task deleted \n");
        }                   
     }
    key.reset();
    }
   } catch (IOException | InterruptedException ex) {     }
}
demo-пример с исходниками - https://github.com/harp077/Watch-Service-Demo

Комментариев нет:

Отправить комментарий

Взаимодействие между приложениями и Watch Service

Взаимодействие между разными приложениями Java можно сделать с помощью файловой системы, базы данных и JMS. Рассмотрим случай ФС - в Java ...