현재 JDK 1.6을 사용하는 당사 제품은 파일 시스템 변경을 위해 JNotify에 의존해야합니다. 그러나 테스트 도중 Win 7 개발 환경에서 완벽하게 작동하는 것을 XP에서 멈추고 서버 2003에서이기는 것으로 나타났습니다. 그래서 나는 작은 테스트 프로그램을 작성했습니다. 다음은 대략적으로 보이는 것입니다.다른 Windows 버전에서의 JNotify의 일관성없는 동작
public void run() {
String path = "D:\\testFolder";
int mask = JNotify.FILE_CREATED | JNotify.FILE_DELETED | JNotify.FILE_MODIFIED | JNotify.FILE_RENAMED;
boolean watchSubtree = true;
File file = null;
try {
JNotify.addWatch(path, mask, watchSubtree, new Listener());
} catch (Exception e) {
e.printStackTrace();
}
}
리스너 클래스는 그냥 인쇄 로그, 내부 작업을하지 않아도 :
public static void main(String[] args) {
SyncUtil instance = new SyncUtil();
instance.start();
Scanner s = new Scanner(System.in);
s.nextLine();
}
SyncUtil이 스레드를 확장하는 클래스입니다 : 메인 클래스에서
나는 단지이 있습니다 . 위의 샘플을 Windows 7/8에서 실행하면 정상적으로 작동합니다. 하지만 Windows Server 2003에서 테스트 할 때 JNotify는 작동을 멈추고 Listener는 전혀 로그를 출력하지 않습니다.
비록 내가 작업을 마친 후 SyncUtil이 잠깐 기다리려고한다면 더 흥미로운 것은 무엇입니까? 내가 추가하면 : 실행 기능이 끝날 때까지 60 초 동안 기다리십시오.
Thread.sleep(60000);
그리고 1 개의 폴더를 모니터링하는 대신 이번에는 2를 모니터링하고 폴더 A와 B라고 부릅니다.
이 경우 Windows Server 2003 시스템에서는 폴더에 파일을 추가하면 60 초 대기 시간 내에 JNotify는 이벤트에 적절하게 반응하여 로그를 인쇄합니다. 그리고 심지어 은 60 초가 지나고 SyncUtil 스레드가 종료 된 경우에도 계속 작동합니다.. 하지만 이제 폴더 B에 파일을 추가합니다 (60 초 대기 시간 후). 아무 것도 인쇄되지 않습니다.
요약하면 증상은 다음과 같습니다. 1. JNotify는 JNotify.addWatch()를 호출하는 스레드가 아직 살아 있는지 여부를 무시하고 작업 7을 계속 수행합니다. 2. XP가 우승하고 서버 2003을 획득하면 Thread가 JNotify.addWatch()를 호출 할 때 JNotify가 이벤트를 올바르게 생성 할 수 있습니다. 스레드가 아직 살아있을 때 적어도 하나의 이벤트를 생성 한 경로는 해당 스레드가 종료 된 후에도 계속 모니터됩니다. 그러나 스레드가 살아있을 때 이벤트를 생성하지 않은 경로는 해당 스레드가 종료 된 후에도 작동하지 않습니다.
지금이 패턴을 알고 있는데 나는이 문제를 해결하기 위해 CountDownLatch를 사용하고 있지만, 왜 이런 일이 일어나고 있는지 정말 궁금합니다. 이런 종류의 의미가 없다고 생각합니다. 문제는 어디에 있다고 생각합니까? 나는 윈도우가 파일 시스템 이벤트를 다르게 트리거한다는 결론을 내리고있다. 이것이 사실일지도 모른다라고 생각 하느냐?
나는 당신의 질문에 조금 잃어 버렸습니다. "무엇"대신에 "왜"를 의미합니까? 그렇다면 실제로 질문에 표시된 샘플은 큰 프로젝트에서 어떤 일이 일어나고 있는지를 모방하려는 테스트 프로그램입니다. 이 프로젝트에서 우리는 "인라인 (in-line) 스레드"를 사용하여 몇 가지 부수적 인 작업을 수행하는 클래스를 가지며 JNotify는 그 중 하나 일 뿐이 었습니다. 나는 확실히 그 스레드에서 JNotify를 취할 수 있지만, 음 ...이 이상한 동작을 해결하는 방법을 알고, 나는 왜 당신이 알고 있는지 궁금해하고 있습니다. :-) – AERYEN
예, 나는 그 의미를 말했습니다. 내가 기억할 수있는 한 (JNotify를 작성한 이후로 수년이 지났음) Windows에서 JNotify는 어떤 스레드가 시계를 추가하는지 전혀 신경 쓰지 않습니다.코드 샘플이 수면을 언급하는 이유는 JVM이 없으면 간단한 예제에서 빠져 나간다는 것입니다. 실제 프로그램에서는 문제가되지 않습니다. –
아, 간단한 예제가 종료되지 않도록 s.nextLine()을 주 함수에 넣었습니다. 그러면 메인 스레드가 살아있게됩니다. 해결 방법으로 – AERYEN