LINUX.ORG.RU

nio и событие ENTRY_MODIFY для директории

 , ,


1

1

Собственно, вопрос скорее теоретического свойства.

Подписываюсь я на события в директории (nio2, практически по примеру http://docs.oracle.com/javase/tutorial/essential/io/notification.html), и вот такая беда: ни одного события ENTRY_MODIFY. Изменения файла приводит к выбрасыванию ENTRY_CREATE. Это нормальное поведение, или я что-то накосячил?

фс - ext4

подписываюсь:

try {
    path.register(watcher,
      ENTRY_CREATE,
      ENTRY_DELETE,
      ENTRY_MODIFY
    )
  } catch {
    case e:IOException =>
      log.debug("all fails with {}",e)
      context.stop(self)
  }

обработка акторами, но потерять не мог. кому интересно - код тут https://github.com/LastPossum/SAWS/blob/master/src/main/scala/PathWatcher.scala

★★★★★

проверка событий:

def innerWork:Unit = {
    val mbKey = Try(watcher.take())

    mbKey match {
      case Success(key) =>
        for(watchEvent <- key.pollEvents.asScala){
          sendToSubscribers(watchEvent)
        }
        key.reset
      case Failure(e) =>
        log.debug("all fails with {}",e)
        context.stop(self)
    }

  }

отправка подписчикам

def sendToSubscribers(event:WatchEvent[_]):Unit = {
    val action = event.kind() match {
      case ENTRY_CREATE => Some(EntryCreate(event.asInstanceOf[WatchEvent[Path]].context()))
      case ENTRY_DELETE => Some(EntryDelete(event.asInstanceOf[WatchEvent[Path]].context()))
      case ENTRY_MODIFY => Some(EntryModify(event.asInstanceOf[WatchEvent[Path]].context()))
      case OVERFLOW => None
    }

    for(a <- action; subscriber<-subcribers){
      subscriber ! a
    }
  }

получение подписчиком

def receive:Receive = {
    case EntryCreate(p) => println(s"entity created:$p")
    case EntryDelete(p) => println(s"entity deleted:$p")
    case EntryModify(p) => println(s"entity updated:$p")
    case _ => println("wtf")
  }

RedPossum ★★★★★ ()
Последнее исправление: RedPossum (всего исправлений: 2)

в общем это все платформозависимо. NTFS вполне имеет этот самый ENTRY_MODIFY. ext4, видимо, нет. Такие дела.

RedPossum ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.