JAVA
java 와치서비스
초록색거북이
2023. 11. 1. 10:06
728x90
반응형
SMALL
java의 WatchService 기능이 존재하는지 모르는 사람이 아마 많지 않을까 싶다.
왜냐면 필자도 모르고 지내다가 업무때문에 이제야 알았다...
그래서 블로그에 남겨 공유하고 기록하려고 한다.
WatchService 란
자바에서 본인이 직접 지정한 디렉토리 내 파일의 변화를 감지해주는 기능이다.
생성, 삭제, 수정 정도의 변화가 있겠다.
사용법
@Service
public class WatchController {
@PostConstruct
public void init() throws IOException, InterruptedException {
String dir = "파일 감지할 디렉토리 경로";
//watchService 객체 생성
WatchService service = FileSystems.getDefault().newWatchService();
//해당 경로를 WatchService 를 생성에 대하여 반응할 수 있도록 등록.
Path path = Paths.get(dir);
path.register(service,
StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_DELETE,
StandardWatchEventKinds.ENTRY_MODIFY);
log.info("====watch service start====");
while (true) {
//해당 서비스의 key 값 추출
WatchKey key = service.take();
//key값을 이용해 이벤트 받아오기. (이벤트가 발생되어 이벤트값을 얻어오기 전까지는 해당 쓰레드 일시정지/대기)
List<WatchEvent<?>> list = key.pollEvents();
for (WatchEvent<?> event : list) {
WatchEvent.Kind<?> kind = event.kind();
Path pth = (Path) event.context();
if (kind.equals(StandardWatchEventKinds.ENTRY_CREATE)) {
System.out.println("CREATE : " + pth.getFileName());
} else if (kind.equals(StandardWatchEventKinds.OVERFLOW)) {
//운영체제에서 이벤트가 소실되었거나 버려질 경우 실행되는 코드
System.out.println("OVERFLOW : " + pth.getFileName());
} else if (kind.equals(StandardWatchEventKinds.ENTRY_MODIFY)) {
System.out.println("MODIFY : " + pth.getFileName());
} else if (kind.equals(StandardWatchEventKinds.ENTRY_DELETE)) {
System.out.println("DELETE : " + pth.getFileName());
}
}
//키 초기화 필수
if (!key.reset()) break;
}
log.info("====watch service stop====");
//서비스 닫기
service.close();
}
}
설명
WatchService service = FileSystems.getDefault().newWatchService();
watchservice를 사용하기 위해 객체를 생성한다.
Path path = Paths.get(dir);
path.register(service,
StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_DELETE,
StandardWatchEventKinds.ENTRY_MODIFY);
해당 경로를 watchservice 생성에 대하여 반응할 수 있도록 등록한다. (create, delete, modify)
WatchKey key = service.take();
해당 서비스의 key 값 추출한다. (watchservice는 key 값으로 상태를 판단한다.)
//key값을 이용해 이벤트 받아오기. (이벤트가 발생되어 이벤트값을 얻어오기 전까지는 해당 쓰레드 일시정지/대기)
List<WatchEvent<?>> list = key.pollEvents();
for (WatchEvent<?> event : list) {
WatchEvent.Kind<?> kind = event.kind();
Path pth = (Path) event.context();
if (kind.equals(StandardWatchEventKinds.ENTRY_CREATE)) {
System.out.println("CREATE : " + pth.getFileName());
} else if (kind.equals(StandardWatchEventKinds.OVERFLOW)) {
//운영체제에서 이벤트가 소실되었거나 버려질 경우 실행되는 코드
System.out.println("OVERFLOW : " + pth.getFileName());
} else if (kind.equals(StandardWatchEventKinds.ENTRY_MODIFY)) {
System.out.println("MODIFY : " + pth.getFileName());
} else if (kind.equals(StandardWatchEventKinds.ENTRY_DELETE)) {
System.out.println("DELETE : " + pth.getFileName());
}
}
pollEvents() 는 이벤트 발생 전까지는 쓰레드를 일시정지 시킨다.
그러다가 이벤트 발생 후 상태 조건에 맞는 값들을 비교한다.
if (!key.reset()) break;
모든 키값을 초기화 해줘야한다.
//서비스 닫기
service.close();
열려있는 watchservice를 직접닫아줘야한다.
끝
728x90
반응형
LIST