2013-09-06 3 views
0

현재 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를 사용하고 있지만, 왜 이런 일이 일어나고 있는지 정말 궁금합니다. 이런 종류의 의미가 없다고 생각합니다. 문제는 어디에 있다고 생각합니까? 나는 윈도우가 파일 시스템 이벤트를 다르게 트리거한다는 결론을 내리고있다. 이것이 사실일지도 모른다라고 생각 하느냐?

답변

0

이것은 매우 이상하지만, : 시계를 추가하는 것은 정말 빠른 작업입니다. 왜 그걸 스레드에 추가하고 있습니까?

+0

나는 당신의 질문에 조금 잃어 버렸습니다. "무엇"대신에 "왜"를 의미합니까? 그렇다면 실제로 질문에 표시된 샘플은 큰 프로젝트에서 어떤 일이 일어나고 있는지를 모방하려는 테스트 프로그램입니다. 이 프로젝트에서 우리는 "인라인 (in-line) 스레드"를 사용하여 몇 가지 부수적 인 작업을 수행하는 클래스를 가지며 JNotify는 그 중 하나 일 뿐이 었습니다. 나는 확실히 그 스레드에서 JNotify를 취할 수 있지만, 음 ...이 이상한 동작을 해결하는 방법을 알고, 나는 왜 당신이 알고 있는지 궁금해하고 있습니다. :-) – AERYEN

+0

예, 나는 그 의미를 말했습니다. 내가 기억할 수있는 한 (JNotify를 작성한 이후로 수년이 지났음) Windows에서 JNotify는 어떤 스레드가 시계를 추가하는지 전혀 신경 쓰지 않습니다.코드 샘플이 수면을 언급하는 이유는 JVM이 없으면 간단한 예제에서 빠져 나간다는 것입니다. 실제 프로그램에서는 문제가되지 않습니다. –

+0

아, 간단한 예제가 종료되지 않도록 s.nextLine()을 주 함수에 넣었습니다. 그러면 메인 스레드가 살아있게됩니다. 해결 방법으로 – AERYEN

관련 문제