2016-09-06 44 views
0

我试图执行“WatchService”弹簧,但它正在寻找不可能的,因为当我试图运行的应用程序上下文,但是Spring上下文的装载时该服务成为停止时控制来在WatchService弹簧

key = watcher.take(); 

由于此应用程序上下文的加载没有发生。下面

是完整的代码

@Component 
public class DirectoryWatchDemo { 


    @PostConstruct 
    public static void test(){ 
     try { 
      WatchService watcher = FileSystems.getDefault().newWatchService(); 
      Path dir = Paths.get("C:/test"); 
      dir.register(watcher, ENTRY_CREATE); 

      System.out.println("Watch Service registered for dir: " + dir.getFileName()); 

      while (true) { 
       WatchKey key; 
       try { 
        key = watcher.take(); 
       } catch (InterruptedException ex) { 
        return; 
       } 

       for (WatchEvent<?> event : key.pollEvents()) { 
        WatchEvent.Kind<?> kind = event.kind(); 

        @SuppressWarnings("unchecked") 
        WatchEvent<Path> ev = (WatchEvent<Path>) event; 
        Path fileName = ev.context(); 

        System.out.println(kind.name() + ": " + fileName); 

        if (kind == ENTRY_MODIFY && 
          fileName.toString().equals("DirectoryWatchDemo.java")) { 
         System.out.println("My source file has changed!!!"); 
        } 
       } 

       boolean valid = key.reset(); 
       if (!valid) { 
        break; 
       } 
      } 

     } catch (IOException ex) { 
      System.err.println(ex); 
     } 
    } 

} 

我这样做,因为我不想手动执行“WatchService”。

回答

0

这是因为你有一个无限循环,因此方法调用@PostConstruct永远不会返回。

(它煤层怪我,那@PostConstruct作品与静态方法,但也许这个作品)

因此,解决办法是,你开始为你守望者的新线程。你可以用不同的方式做到这一点:

  • 刚开始一个新的线程
  • 添加@Async该方法(我不知道这是否适用于@PostConstruct方法)(主要缺点是,这将启动以前生产完整的应用程序上下文初始化)
  • 滥用​​注释:@Scheduled(fixedDelay = Long.MAX_VALUE) - (优于@PostConstruct + @Async是:它的工作原理是肯定的,它只是开始后完全上下文初始化)
+0

感谢您的回复:)我正在使用@Scheduled,它正在为我工​​作 – vijendra

1

WatchService.take等待下一个手表键:“检索并移除下一个手表键,等待没有任何手表存在。”

PostConstruct - 这是一个Java注释,而不是Spring注解 - “用于需要在依赖注入完成后执行以执行任何初始化的方法,必须在该类投入服务之前调用此方法“。基于这个文档,似乎PostConstruct必须在bean投入服务之前返回(“在投入服务之前必须调用“)。

但您的PostConstruct方法不返回;所以PostConstruct不是你需要的。

您可能会考虑实施Spring InitializingBean接口,该接口提供回调方法afterPropertiesSet。它应该允许你启动这种类型的服务方法。

否则,您可以查看Apache VFS2虚拟文件系统,其中包括文件夹监视器。这是我的项目使用的;在系统启动时启动观察器非常容易;并且它还监视文件删除,更新和创建事件(与Camel文件观察器不同)。

+0

感谢您的回复:) – vijendra