Java 如何在watchservice中正确处理pollEvents()溢出类型?
我正在使用一个监视服务监视一个目录,并在新创建的文件上触发逻辑。我最近遇到的一个挑战是,当需要处理大量文件并将其复制到watch目录中时,会触发溢出 报告中提到了溢出: 文件系统报告事件的速度可能快于检索或处理事件的速度,而实现可能会对其累积的事件数量施加未指定的限制。如果实现有意丢弃事件,那么它会安排键的pollEvents方法返回事件类型为溢出的元素 我的问题是,如何正确处理溢出,而不丢失任何需要处理的事件 我的watchservice代码如下所示:Java 如何在watchservice中正确处理pollEvents()溢出类型?,java,watchservice,Java,Watchservice,我正在使用一个监视服务监视一个目录,并在新创建的文件上触发逻辑。我最近遇到的一个挑战是,当需要处理大量文件并将其复制到watch目录中时,会触发溢出 报告中提到了溢出: 文件系统报告事件的速度可能快于检索或处理事件的速度,而实现可能会对其累积的事件数量施加未指定的限制。如果实现有意丢弃事件,那么它会安排键的pollEvents方法返回事件类型为溢出的元素 我的问题是,如何正确处理溢出,而不丢失任何需要处理的事件 我的watchservice代码如下所示: Path myD
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();
}
...
Path myDir=Path.get(srcDir);
try(WatchService watcher=myDir.getFileSystem().newWatchService()){
myDir.register(观察者、条目创建、条目修改);
int x=0;
对于(;;){
x++;
WatchKey WatchKey=watcher.take();
debug(“事件{}”,x);
List我在实践中从未见过溢出事件。它的意思是通知您需要重新处理您正在监视的任何目录。您不需要退出程序,只需使用单线程文件.List()调用对目录进行爬网。我已在下面剪切粘贴了如何处理它。此代码
1) 记录问题
2) 设置一个标志以触发对目录中所有文件进行爬网的目录重新处理
3) 跳过此WatchEvent的其余处理
// log overflow events and trigger reprocess later.
if (kind == OVERFLOW)
{
logger.warn("File listener recieved an overflow event. You should probably check into this");
overflowTriggeredFlag = true;
continue;
}
溢出意味着您丢失了事件。说您希望处理溢出而不丢失事件是没有意义的。@PeterLawrey文档还声明消费者可以使用此事件作为触发器来重新检查对象的状态。
如果我由于溢出而丢失事件,我的下一个事件是否仍然排队?如果是这样,如何获得下一组事件?