Diferenças entre a API Java WatchService e a Apache Commons IO Monitor Library
1. Visão geral
Muito antes de a API JavaWatchService ser lançada no Java 7, a biblioteca Apache Commons IO Monitoring já estava tratando do mesmo caso de uso de monitoramento de um local ou diretório do sistema de arquivos para alterações.
Neste artigo, exploraremos as diferenças entre as duas APIs.
2. Dependências do Maven
Para usar o Apache Commons IO, a seguinte dependência precisa ser adicionada empom:
commons-io
commons-io
2.5
E, é claro, o serviço de monitoramento faz parte do JDK, portanto não precisa de dependência externa.
3. Comparação de recursos
3.1. Processamento Orientado a Eventos
A APIWatchService é orientada pelos eventos de alteração do sistema de arquivos acionados pelo sistema operacional. Essa abordagem evita que o aplicativo consulte o sistema de arquivos repetidamente em busca de alterações.
A biblioteca Apache Commons IO Monitor, por outro lado, pesquisa a localização do sistema de arquivos em um intervalo de suspensão configurável chamando o métodolistFiles() da classeFile. Essa abordagem desperdiça ciclos de CPU, especialmente se nenhuma alteração ocorrer.
3.2. Método de retorno de chamada
WatchService API não fornece métodos de retorno de chamada. Em vez disso, fornece dois tipos de métodos de pesquisa para verificar se novos eventos de alteração estão disponíveis para processamento:
-
Métodos de bloqueio comopoll() (com um parâmetro de tempo limite) etake()
-
Método sem bloqueio comopoll() (sem um parâmetro de tempo limite)
Com os métodos de bloqueio, o encadeamento do aplicativo inicia o processamento apenas quando novos eventos de alteração estão disponíveis. Portanto, ele não precisa continuar pesquisando novos eventos.
Os detalhes e o uso desses métodos podem ser encontrados em nosso artigohere.
Em contraste, a biblioteca Apache Commons IO fornece métodos de retorno de chamada na interfaceFileAlterationListener que são invocados quando uma mudança no local ou diretório do sistema de arquivos é detectada.
FileAlterationObserver observer = new FileAlterationObserver("pathToDir");
FileAlterationMonitor monitor = new FileAlterationMonitor(POLL_INTERVAL);
FileAlterationListener listener = new FileAlterationListenerAdaptor() {
@Override
public void onFileCreate(File file) {
// code for processing creation event
}
@Override
public void onFileDelete(File file) {
// code for processing deletion event
}
@Override
public void onFileChange(File file) {
// code for processing change event
}
};
observer.addListener(listener);
monitor.addObserver(observer);
monitor.start();
3.3. Estouro de evento
WatchService API é conduzida pelos eventos do sistema operacional. Portanto, existe a possibilidade de o buffer do sistema operacional que retém os eventos exceder, se o aplicativo não puder processar os eventos com rapidez suficiente. Neste cenário, o eventoStandardWatchEventKinds.OVERFLOW é disparado indicando que alguns dos eventos foram perdidos ou descartados antes que o aplicativo pudesse lê-los.
Isso requer o tratamento adequado do eventoOVERFLOW no aplicativo para garantir que o aplicativo possa lidar com qualquer explosão repentina de eventos de mudança que possam acionar o eventoOVERFLOW.
A biblioteca Commons IO, por outro lado, não se baseia nos eventos do sistema operacional e, portanto, não há questão de excesso.
Em todas as pesquisas, o observador obtém a lista de arquivos no diretório e a compara com a lista obtida na pesquisa anterior.
-
Se um novo nome de arquivo for encontrado na última votação,onFileCreate() é invocado no ouvinte
-
Se um nome de arquivo encontrado na votação anterior estiver faltando na lista de arquivos obtida na última votação,onFileDelete() é chamado no ouvinte
-
Se uma correspondência for encontrada, o arquivo será verificado quanto a alterações nos atributos, como data da última modificação, comprimento etc. Se uma mudança for detectada,onFileChange() é invocado no ouvinte
4. Conclusão
Neste artigo, conseguimos destacar as principais diferenças nas duas APIs.
E, como sempre, o código-fonte completo dos exemplos usados neste artigo está disponível emthe Github project.