2011-12-03 1 views
4

기본적으로 새로운 Java 7 WatchService를 사용하여 디렉토리를 모니터링하고 있습니다.자바 7 WatchService : 핸들러에서 이벤트 소스를 변경할 때 무한 루프의 이벤트를 피함

나는 디렉토리에서 발급 한 모든 IO 이벤트를 수신하는 일련의 처리기를 가지고 있습니다.

핸들러가 어떤 이유로 든 IO 이벤트 (== 파일)의 이유를 변경해야하는 경우가 있습니다. 예를 들어 누군가 모니터 된 폴더에 파일을 넣는 경우, 핸들러 중 하나가 확장자를 변경하거나 파일 이름에 무엇인가를 추가 할 수 있습니다.

이러한 작업은 물론 새 IO 이벤트를 트리거하고 앞서 언급 한 처리기가이를 가져옵니다. 그런 다음 다시 한 번 변경합니다. 이것은 분명히 무한 루프로 연결됩니다 ...

Java는 이러한 상황을 처리 할 수있는 방법을 제공합니까? 그렇지 않다면 어떻게 처리할까요?

기본적으로 해당 이벤트 처리기의 동작으로 인해 이벤트가 발생하지 않은 경우에만 이벤트 처리기를 실행하고 싶습니다.

업데이트 : 솔루션에 관해서는 차라리 메인 이벤트 라우터의 코드에서 변경 사항을 작성합니다. 쓰는 모든 처리기에서이 점에 대해 걱정하지 않습니다 ("처리기는 변경하지 않습니다. 전에").

+0

이전 작업을 기반으로 처리기에서 무시할 이벤트를 추적해야한다고 생각합니다. 가장 쉬운 방법은 Mark Elliot의 대답이 가능한지 여부입니다. – jontro

답변

4

기본 사례가 없으면 무한 루프 만 발생합니다.

사람들이 확장명이 '.bar'인 파일을 넣고 확장명을 '.foo'로 지정한다고 가정하면 처리기는 해당 변경을 현재 확장명이 '.bar'인 경우에만 수행합니다.

처리기가 여전히 새로운 <file>.foo에 대한 이벤트를 수신하더라도이를 무시하고 "무한"이벤트 전파를 중지 할 수 있습니다.

+0

여전히 질문에는 장점이 있습니다. 감시 대상 디렉토리에있는 모든 파일에 대한 작업을 원한다고 생각한 다음 쉽게 감지 할 수없는 작업을 수행한다고 가정 해 보겠습니다. 따라서 외부 발신자가 수정 작업을 수행하기를 원합니다. – jontro

+0

@jontro : 요점은 당신이 * 이벤트를 자체 생성하는 경우에 해당 세대가 무한 루프를 일으킬 수 있다는 것입니다. 재귀와 마찬가지로 기본 케이스를 가져야합니다. –

+0

그래, 당연히 있지만 jontro와 마찬가지로 - 외부 발신자가있는 경우에만 조치를 취하는 것이 합리적이고 가능한 시나리오처럼 보입니다. 차라리 메인 이벤트 라우터의 코드에서 변경 사항을 작성하는 것은 모든 핸들러에서 걱정할 필요가 없습니다. –

0

이벤트를 처리하는 코드가 새 이벤트를 트리거 할 때마다 새 스레드를 사용하는 것이 좋습니다. 이벤트 핸들 내부에서 변경된 파일의 이름을 변경해야하는지 확인합니다. 예를 들어 이름 바꾸기를 수행하는 새 스레드를 시작합니다 (이벤트에서 돌아 오지 않는 경우). 이벤트 처리 코드가 어떤 식 으로든 종료되기 때문에 무한 루프를 피할 수 있습니다.

+0

새로운 글타래? 쓰레드는 많은 양의 시스템 메모리를 차지하며 필요 이상으로 많은 쓰레드를 사용하지 않는 것이 좋습니다 **. 진지하게, 이것을하지 마십시오, 어쨌든 그것을 고쳐주지 않을 것입니다. – ThePyroEagle

관련 문제