web-dev-qa-db-fra.com

Comment surveiller un dossier / répertoire au printemps?

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

8
amkz

Vous pouvez utiliser pur Java pour cela pas besoin de ressort https://docs.Oracle.com/javase/tutorial/essential/io/notification.html

3
Sławomir Czaja

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).

3
Gary Russell

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

}
1
Hitham S. AlQadheeb

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

0
Sanket Mehta

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 )

0
s.ijpma