1

Мне нужно отслеживать изменения (загруженные файлы) в двух каталогах в веб-приложении. Я создал ServletContextListener, который запускает мониторинг этих двух каталогов.Watch Service Java - Два параллельных потока в фоновом режиме

Моя проблема заключается в том, что при первом запуске поток блокируется, а второй мониторинг не запускается.

Можно ли отслеживать две разные папки, работающие параллельно и в фоновом режиме?

Я знаю, что проблема связана с бесконечным циклом, но не знаю, как поставить эту нить в фоновом режиме. Любая помощь будет оценена. Большое спасибо заранее

ContextListener

@Override 
    public void contextInitialized(ServletContextEvent event) { 

     Path pathFolder1 = Paths.get("my_folder_1_path"); 
     MyWatcher watcher1 = new MyWatcher(); 

     Path pathFolder2 = Paths.get("my_folder_2_path"); 
     MyWatcher watcher2 = new MyWatcher(); 

     watcher1.startMonitoring(pathFolder1); 
     watcher2.startMonitoring(pathFolder2); 
    } 

MyWatcher

public void startMonitoring(Path directory) { 

     try { 
      FileSystem fs = directory.getFileSystem(); 
      WatchService watcher = fs.newWatchService(); 

      while(true) { 

       directory.register(watcher, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE); 
       WatchKey watckKey = watcher.take(); 
       List<WatchEvent<?>> events = watckKey.pollEvents(); 

       for (WatchEvent event : events) { 

        if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) { 
         System.out.println("File created: " + event.context().toString()); 
        } 
        if (event.kind() == StandardWatchEventKinds.ENTRY_DELETE) { 
         System.out.println("File removed: " + event.context().toString()); 
        } 
       } 
       watckKey.reset(); 
      } 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
+0

Какие технологии на стороне клиента вы используете? – pahan

+0

Мое окружение Wildfly10 jsf primefaces – gfinotti

ответ

1

Вы должны настроить нить завод на сервере приложений, вводить его через @Resource аннотацию, и используйте потоки оттуда. Пример с googled будет a blog entry about this.

+1

Хорошо сработало, спасибо @ tirpitz.verus – gfinotti