如何使公共VFS永久运行

时间:2013-04-04 14:43:43

标签: java vfs

我正在使用commons VFS监视某些文件夹的更改(主要是插入新文件),程序应该永久运行,我使用下面的代码

FileSystemManager fsManager = VFS.getManager();
FileObject listendir = fsManager.resolveFile(path);
DefaultFileMonitor fm = new DefaultFileMonitor(new VfsListener());
fm.setRecursive(true);
fm.addFile(listendir);
fm.start();

其中path是文件夹路径,VfsListener是一个实现FileListener的类,当我运行它运行的程序然后立即关闭,当我在fm.start()之后添加它时:

Thread.sleep(100000)

程序运行了一段时间,然后在超时后关闭,我不希望这样,我希望程序永久朗读,如果有人知道请回复

1 个答案:

答案 0 :(得分:5)

VFS将FileMonitor线程作为低优先级的守护程序线程启动。方法setDaemon(boolean)的定义表明

  

将此线程标记为守护程序线程或用户线程。该   当所有运行的线程都是全部时,Java虚拟机将退出   守护线程。   

  必须在线程启动之前调用此方法。    

只要你在主线程中“睡觉”,这就是你的程序工作的原因。但是,如果您将此程序作为独立的Java程序运行,则这只是一个问题。如果您在像Jboss这样的应用程序服务器中运行相同的代码,代码就可以正常工作。

如果您仍希望独立程序无限期地等待,您可以修改程序以使用ThreadPoolExecutor,它将基本等待新任务在任务队列中可用。

public static void main(String[] args) throws FileSystemException {
    Executor runner = Executors.newFixedThreadPool(1);
    runner.execute(new Runnable() {

        @Override
        public void run() {
            FileObject listendir = null;
            try {
                FileSystemManager fsManager = VFS.getManager();
                listendir = fsManager.resolveFile(absolutePath);
            } catch (FileSystemException e) {
                e.printStackTrace();
            }
            DefaultFileMonitor fm = new DefaultFileMonitor(new FileListener() {

                @Override
                public void fileDeleted(FileChangeEvent event) throws Exception {
                    System.out.println(event.getFile().getName().getPath()+" Deleted.");
                }

                @Override
                public void fileCreated(FileChangeEvent event) throws Exception {
                    System.out.println(event.getFile().getName().getPath()+" Created.");
                }

                @Override
                public void fileChanged(FileChangeEvent event) throws Exception {
                    System.out.println(event.getFile().getName().getPath()+" Changed.");
                }
            });
            fm.setRecursive(true);
            fm.addFile(listendir);
            fm.start();
        }
    });
}

希望这会有所帮助。