4

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)

プログラムはしばらく実行され、タイムアウトに達すると終了します。私はそれを望んでいません。プログラムを永続的に実行したいのですが、誰か知っている場合は返信してください

4

1 に答える 1

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();
        }
    });
}

お役に立てれば。

于 2013-07-23T10:38:29.150 に答える