Dúvida java.nio.file: WatchService API funciona para pastas remotas?

o pacote java.nio.file (jdk 7) possui várias classes que permitem monitorar eventos do sistema de arquivos (delete, modify, create)

fiz um teste e vi que funciona legal localmente, mas quando tento monitorar uma pasta em uma máquina remota na intranet (ambas Windows 7) os eventos não disparam.

Alguem sabe se é possivel usar essa funcionalidade em pastas remotas ??

minha classe de teste
(ref: http://docs.oracle.com/javase/tutorial/essential/io/notification.html)

public class Test01 {
    
    public static void main(String[] args) throws IOException {
        m2();
    }
    
    static void m2() throws IOException{
        Path pastaMonitorada = Paths.get("\\\\192.168.1.2/rafael/pasta");    // teste local ok  ("C:\\pasta");        
        
        WatchService monitor = FileSystems.getDefault().newWatchService();
        Map<WatchKey, Path> registroPastasMonitoradas = new HashMap<>();
        
        //eventos q serão monitorados
        WatchKey setMonitorEventos = pastaMonitorada.register(monitor, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);
        
        //link watched folder with events to be listened
        registroPastasMonitoradas.put(setMonitorEventos, pastaMonitorada);
        
        while(true){
            WatchKey watchKey = null;
            try {
                watchKey = monitor.take();
            } catch (InterruptedException e) {
                System.out.println("interrupeted ex: "+e.getMessage());
            }
            
            //pasta monitorada
            Path pasta = registroPastasMonitoradas.get(watchKey);
            System.out.println("pasta: "+pasta.toString());
            if(pasta == null){
                System.err.println("WatchKey not recognized!!");
                continue;
            }
            
            for(WatchEvent<?> event : watchKey.pollEvents()){
                WatchEvent.Kind kind = event.kind();
                
                if (kind == OVERFLOW) {
                    continue;
                }
                
                WatchEvent<Path> ev = cast(event);
                Path name = ev.context();
                Path child = pastaMonitorada.resolve(name);
                //imprime o evento     
                System.out.format("%s: %s\n",  event.kind().name(), child);
                
                boolean valid = setMonitorEventos.reset();
                if(!valid){
                    registroPastasMonitoradas.remove(watchKey);
                    
                    if(registroPastasMonitoradas.isEmpty())
                        break;
                }
            }                     
        }
    }
    
    static <T> WatchEvent<T> cast(WatchEvent<?> event) {
        return (WatchEvent<T>)event;
    }    
}

No javadoc da classe WatchService está escrito:

“If a watched file is not located on a local storage device then it is implementation specific if changes to the file can be detected. In particular, it is not required that changes to files carried out on remote systems be detected.”

Então pode ser que funcione remotamente, mas não é obrigatório e depende da implementação.

Aqui tem mais observações sobre isso:

http://stackoverflow.com/questions/8869039/monitoring-directory-on-another-pc

[quote=rogeriopaguilar]No javadoc da classe WatchService está escrito:

“If a watched file is not located on a local storage device then it is implementation specific if changes to the file can be detected. In particular, it is not required that changes to files carried out on remote systems be detected.”

Então pode ser que funcione remotamente, mas não é obrigatório e depende da implementação.[/quote]

No JDK 7, o WatchService é implementado pela classe sun.nio.fs.WindowsWatchService, que chama a API do Windows ReadDirectoryChangesW.

Pode ser que essa API do Windows tenha algum problema justamente com drives mapeados e UNC (ou seja, a sintaxe \servidor\share que você usou no seu programa). Já vi alguns casos na Internet reclamando dessa API, que pode não funcionar com drives mapeados ou UNC, dependendo das circunstâncias (versão do sistema operacional que está hospedando os arquivos, service packs, etc.);

No link do stackoverflow o pessoal fala pra mapear utilizando net use no windows que funciona. Eu fiz um teste aqui utilizando um mapeamento via nfs no linux e funcionou também. Talvez mapeando no windows funcione também, tem que testar, ou então desenvolver algum tipo de agente que fique no cliente e envie a informação para algum servidor quando a pasta for modificada no cliente.

rogeriopaguilar, como vc fez esse mapeamento via NFS no linux ??

fiz um outro teste aqui entre uma máquina linux (monitorada) e uma máquina windows (monitor). Compartilhei a pasta da máquina linux, e na máquina windows usei net use pra mapear:

net use z: \\maq-linux-mint\pastaCompartilhada

consegui acessar a pasta, mas ainda sim os eventos não estão sendo capturados :frowning:

Bom, no meu caso eu fiz um compartilhamento de linux pra linux. Depois vou ver se consigo uma máquina com windows pra fazer um teste.