WatchService — 감시 서비스
WatchService — 감시 서비스
등록된 객체의 변경 사항과 이벤트를 감시하는 감시 서비스예요. 예를 들어 파일 관리자가 감시 서비스로 디렉터리의 변경을 감시해, 파일이 생성되거나 삭제될 때 목록 표시를 갱신할 수 있어요.
본문
Watchable 객체는 register 메서드로 감시 서비스에 등록되며, 등록을 나타내는 WatchKey를 반환해요. 객체에 대한 이벤트가 감지되면 키가 신호 상태가 되고, 현재 신호 상태가 아니면 감시 서비스에 큐잉되어 poll이나 take 메서드를 호출하는 소비자가 키를 가져와 이벤트를 처리해요. 이벤트를 처리한 뒤 소비자는 키의 reset 메서드로 키를 리셋해서 다시 신호되고 추가 이벤트로 재큐잉되게 해요.
등록은 키의 cancel 메서드로 취소해요. 취소 시점에 큐에 있던 키는 가져올 때까지 큐에 남아요. 객체에 따라 키가 자동으로 취소될 수도 있어요. 감시 서비스는 여러 동시 소비자가 사용하기에 안전해요.
WatchKey poll()— 다음으로 대기 중인 키를 가져와 제거하고, 대기 중인 키가 없으면null을 반환해요.WatchKey poll(long timeout, TimeUnit unit) throws InterruptedException— 필요한 경우 지정된 시간만큼 기다린 다음, 다음으로 대기 중인 키를 가져와 제거해요.WatchKey take() throws InterruptedException— 다음으로 대기 중인 키를 가져와 제거하며, 없으면 키가 큐에 들어올 때까지 기다려요.void close() throws IOException— 이 감시 서비스를 닫아요. 그 후 키를 가져오려고 기다리는 스레드는ClosedWatchServiceException을 던져요. 이벤트가 가져올 수 있는 것보다 빨리 보고되면 구현은 축적할 이벤트 수에 한도를 둘 수 있고, 이벤트를 버릴 때는OVERFLOW타입의 이벤트를 반환해요.
try (WatchService watcher = FileSystems.getDefault().newWatchService()) {{
Path dir = Paths.get(".");
dir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE);
while (true) {{
WatchKey key = watcher.take();
for (WatchEvent<?> e : key.pollEvents()) {{
System.out.println("생성: " + e.context());
}}
key.reset();
}}
}}