Je ne veux pas écrire Spring Boot Application au printemps qui surveillera le répertoire dans Windows, et lorsque je change de sous-dossier ou en ajoute un nouveau ou supprime un existant, je veux obtenir des informations à ce sujet.
Comment puis je faire ça? J'ai lu celui-ci: http://docs.spring.io/spring-integration/reference/html/files.html et chaque résultat sous 'spring file watcher' dans google, mais je peux ' t trouver une solution ...
Avez-vous un bon article ou un bon exemple avec quelque chose comme ça? Je ne veux pas aimer comme ça:
@SpringBootApplication
@EnableIntegration
public class SpringApp{
public static void main(String[] args) {
SpringApplication.run(SpringApp.class, args);
}
@Bean
public WatchService watcherService() {
...//define WatchService here
}
}
Cordialement
Vous pouvez utiliser pur Java pour cela pas besoin de ressort https://docs.Oracle.com/javase/tutorial/essential/io/notification.html
Voir le Spring Integration Samples Repo il y a un exemple de fichier sous 'basic'.
Il y a un exemple plus récent et plus sophistiqué sous les applications file-split-ftp
- il utilise Spring Boot et Java par rapport au xml utilisé dans l'exemple plus ancien).
spring-boot-devtools
a 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;
}
}
}
Juste au cas où, si quelqu'un cherche un observateur récursif de sous-dossiers, ce lien peut aider: Comment regarder un dossier et des sous-dossiers pour les changements
Sans donner ici les détails, quelques conseils qui pourraient vous aider.
Vous pouvez prendre le répertoire WatchService
code de la réponse de Sławomir Czaja:
Vous pouvez utiliser pur Java pour cela pas besoin de ressort https://docs.Oracle.com/javase/tutorial/essential/io/notification.html
et envelopper ce code dans une tâche exécutable. Cette tâche peut informer vos clients de la modification du répertoire à l'aide de SimpMessagingTemplate
comme décrit ici: envoi de poignée Websocket STOMP
Ensuite, vous pouvez créer un planificateur comme décrit ici: Planification qui gère le démarrage et la réassurance de votre tâche.
N'oubliez pas de configurer la prise en charge de la planification et du websocket dans votre mvc-config ainsi que le support STOMP côté client (lecture supplémentaire ici: STOMP sur Websocket )