我正在使用一个观察服务来监视目录并在新文件创建时触发逻辑。我最近遇到的一个挑战是当大量需要处理的文件太快地复制到观察目录中时触发了溢出。
API关于溢出的说明如下:
文件系统可能报告事件的速度比检索或处理速度更快,实现可能对它所能积累的事件数量施加未指定的限制。如果一个实现明知道丢弃事件,则它会安排键的pollEvents方法返回一个具有事件类型OVERFLOW的元素。
我的问题是,如何正确处理溢出,而不会丢失需要处理的任何事件?
我的观察服务代码如下:
文件系统可能报告事件的速度比检索或处理速度更快,实现可能对它所能积累的事件数量施加未指定的限制。如果一个实现明知道丢弃事件,则它会安排键的pollEvents方法返回一个具有事件类型OVERFLOW的元素。
我的问题是,如何正确处理溢出,而不会丢失需要处理的任何事件?
我的观察服务代码如下:
Path myDir = Paths.get(srcDir);
try(WatchService watcher = myDir.getFileSystem().newWatchService()){
myDir.register(watcher, ENTRY_CREATE,ENTRY_MODIFY);
int x = 0;
for(;;){
x++;
WatchKey watchKey = watcher.take();
LOGGER.debug("Event # {}",x);
List<WatchEvent<?>> events = watchKey.pollEvents();
LOGGER.info("Events Size {}",events.size());
for (WatchEvent event : events) {
if(event.kind() == OVERFLOW){
LOGGER.error("The Maximum watchService events has been reached!");
System.exit(1); //I exit so I know there is a problem - but how should I handle this?
}
if (event.kind() == ENTRY_CREATE) {
LOGGER.info("File created: " + event.context().toString());
LOGGER.info("Beginning Processing:" +event.context().toString());
...business logic here...
}
}
watchKey.reset();
}
...