본문 바로가기

JAVA

java 와치서비스

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

'JAVA' 카테고리의 다른 글

자바 Math.random() 활용한 난수 생성  (0) 2023.03.14
String to int , int to String  (0) 2023.03.14
JAVA 와 Mysql 타입 매칭  (0) 2023.02.10
JAVA 파일 다운로드 구현 코드  (2) 2022.05.12
ArrayList 와 LinkedList 차이점  (0) 2022.04.17