私は春に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
}
}
よろしく
あなたは純粋なJavaこれのために春の必要はありません https://docs.Oracle.com/javase/tutorial/essential/io/notification.html を使用できます
Spring Integration Samples Repo を参照してください。「basic」の下にファイルサンプルがあります。
アプリケーションの下に、より最近のより洗練されたサンプルがありますfile-split-ftp
-Spring BootとJava構成と以前のサンプルで使用されていたxmlを使用します。
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;
}
}
}
念のために、誰かが再帰的なサブフォルダーウォッチャーを探している場合、このリンクが役立つことがあります。 フォルダーとサブフォルダーの変更を監視する方法
ここで詳細を説明せずに、役立ついくつかの指針を示します。
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 )