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