web-dev-qa-db-ja.com

春にフォルダ/ディレクトリを監視する方法は?

私は春にSpring Boot Applicationを記述したくないのですが、これはウィンドウのディレクトリを監視するため、サブフォルダーを変更したり、新しいフォルダーを追加したり、既存のフォルダーを削除したりすると、その情報を取得します。

どうやってやるの?私はこれを読みました: http://docs.spring.io/spring-integration/reference/html/files.html と各結果はGoogleの「Spring File Watcher」の下にありますが、私はできます ' t解決策を見つける...

このような良い記事や例はありますか?私はこのようにしたくありません:

@SpringBootApplication
@EnableIntegration
public class SpringApp{

    public static void main(String[] args) {
        SpringApplication.run(SpringApp.class, args);
    }

    @Bean
    public WatchService watcherService() {
        ...//define WatchService here
    }
}

よろしく

8
amkz

あなたは純粋なJavaこれのために春の必要はありません https://docs.Oracle.com/javase/tutorial/essential/io/notification.html を使用できます

3
Sławomir Czaja

Spring Integration Samples Repo を参照してください。「basic」の下にファイルサンプルがあります。

アプリケーションの下に、より最近のより洗練されたサンプルがありますfile-split-ftp-Spring BootとJava構成と以前のサンプルで使用されていたxmlを使用します。

3
Gary Russell

spring-boot-devtoolsにはFileSystemWatcherがあります

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
</dependency>

FileWatcherConfig

@Configuration
public class FileWatcherConfig {
    @Bean
    public FileSystemWatcher fileSystemWatcher() {
        FileSystemWatcher fileSystemWatcher = new FileSystemWatcher(true, Duration.ofMillis(5000L), Duration.ofMillis(3000L));
        fileSystemWatcher.addSourceFolder(new File("/path/to/folder"));
        fileSystemWatcher.addListener(new MyFileChangeListener());
        fileSystemWatcher.start();
        System.out.println("started fileSystemWatcher");
        return fileSystemWatcher;
    }

    @PreDestroy
    public void onDestroy() throws Exception {
        fileSystemWatcher().stop();
    }
}

MyFileChangeListener

@Component
public class MyFileChangeListener implements FileChangeListener {

    @Override
    public void onChange(Set<ChangedFiles> changeSet) {
        for(ChangedFiles cfiles : changeSet) {
            for(ChangedFile cfile: cfiles.getFiles()) {
                if((cfile.getType().equals(Type.MODIFY) || cfile.getType().equals(Type.ADD)) && !isLocked(cfile.getFile().toPath())) {
                    System.out.println("Done writing: "+cfile.getFile().getName());
                }
            }
        }
    }

    private boolean isLocked(Path path) {
        try (FileChannel ch = FileChannel.open(path, StandardOpenOption.WRITE); FileLock lock = ch.tryLock()) {
            return lock == null;
        } catch (IOException e) {
            return true;
        }
    }

}
1

念のために、誰かが再帰的なサブフォルダーウォッチャーを探している場合、このリンクが役立つことがあります。 フォルダーとサブフォルダーの変更を監視する方法

0
Sanket Mehta

ここで詳細を説明せずに、役立ついくつかの指針を示します。

SławomirCzajaの回答からディレクトリWatchServiceコードを取得できます。

あなたは純粋なJavaこれのために春の必要はありません https://docs.Oracle.com/javase/tutorial/essential/io/notification.html を使用できます

そしてそのコードを実行可能なタスクにラップします。このタスクは、ここで説明されているようにSimpMessagingTemplateを使用してディレクトリの変更をクライアントに通知できます。 Websocket STOMP handle send

次に、ここで説明されているようなスケジューラを作成できます。 Scheduling これは、タスクの開始と再実行を処理します。

Mvc-configでスケジューリングとWebSocketサポートを構成し、クライアント側でSTOMPサポートを構成することを忘れないでください(さらに読む: STOMP over Websocket

0
s.ijpma