2012-02-05 5 views
3

JNotify를 사용하여 디스크에서 파일을 선택하고 차단 대기열 (예 : newQueue)에로드하는 프로그램을 작성 중입니다. while (true) 루프에서 실행되는 두 개의 악마 스레드가 있습니다. 1 개의 thread는, take()를 사용해 새로운 큐 (JNotify가 파일을 보관 유지하는)에있는 파일을 찾고, 일단 수신하면, 그것을 처리하기 위해서 ThreadPoolExecutor에 건네줍니다. threadpoolexecutor는 작업자 스레드 세트를 유지 관리하고 명령을 실행합니다. 작업자 스레드는 단순히 파일을 구문 분석하고 데이터를 DB에 삽입합니다. 모든 것이 잘 작동하면 상태가 실패로 돌아갑니다. 이제이 스레드는 추가 처리를 위해 파일을 다른 차단 대기열 (예 : moverQueue)에 저장합니다.다중 스레드 파일 폴링

두 번째 악마 스레드는 take()를 사용하여이 이동기 큐를 풀링하고 일단 파일이 도착하면 처리를 위해 자체 Threadpoolexecutor에 전달합니다. 상태에 따라 파일이 별도의 위치로 이동됩니다. 이제 작업이 끝나면 스레드 풀을 모두 중지하므로 두 악마 스레드도 중지됩니다.

여기서 문제는 재시도 논리가 있고 복구 가능한 일부 처리가 실패 할 경우 파일이 재시도 횟수가 증가 된 새 대기열에 다시 저장된다는 것입니다.

내 작업이 끝났는지 그리고 스레드 풀을 종료해도 괜찮은지 결정할 수있는 우아한 방법을 찾지 못했습니다. 일부 파일이 실패 할 수 있으므로 파일 수에 의존 할 수 없습니다. 내 악마 스레드가 스레드 풀을 유지 관리하고 있기 때문에 작업 스레드에 의해 처리되는 재시도에 대해 전혀 몰라.

이 디자인 접근 방식이 좋든 싫든 해답을 제시하십시오. 한 번에 40K라고하는 파일이 너무 많습니다.

답변

0

아마도 프로그램에 파일이 멈추었을 때를 알기위한 간단한 플래그가 이미 있습니다. 프로그램을 종료하기 전에 이미 프로그램에있는 파일이 처리되었는지 확인해야합니다.

"filesToHandle"이 들어올 때 모든 파일을 추가하고 이 성공적 일 때 파일을 제거하여이 작업을 수행 할 수 있습니다. 작업자 스레드가을 성공적으로 처리했습니다.

세트에서 파일을 제거 할 때 플래그가 true이고 filesToHandle 세트가 비어 있으면 실행 프로그램을 종료 할 수 있습니다. 마찬가지로, 플래그를 true로 설정하면 세트가 비어있는 경우 즉시 실행 프로그램을 종료하십시오.

경쟁 조건을 피하기 위해이 작업을 동기화하십시오.

실제로 파일 수를 유지 보수하는 것과 다르지 않습니다. 나는 그것이 왜 당신이 그것이 실행 가능한 선택이 아니라고 생각하는지 모르겠습니다. 코드가 처리의 성공 여부에 따라 재 시도할지 여부를 결정합니다. 의 성공 횟수가 일 때만 줄이면됩니다.

+0

악마 스레드가 파일을 가져 와서 작업자 스레드로 전달하는 모든 수신 파일에 대한 대기열을 이미 유지 관리하고 있습니다. 파일 목록이 동일한 다른 집합을 유지할 것을 제안합니까? 실패 할 때 새 큐가 비게되면 executor를 확인하거나 종료 할 수 없습니다. 작업자 스레드가 새 큐에 파일을 다시 넣음으로써 다른 작업자 스레드가이를 처리 할 수 ​​있습니다. 대기열이 비어 있지만 작업자 스레드가 stil 실행하고 실패의 경우 대기열에 다시 파일을 넣을 수 있습니다 .Queue는 비어있는 작업을 반영하지 않습니다 완료되었습니다 –

관련 문제