JNotify를 사용하여 디스크에서 파일을 선택하고 차단 대기열 (예 : newQueue)에로드하는 프로그램을 작성 중입니다. while (true) 루프에서 실행되는 두 개의 악마 스레드가 있습니다. 1 개의 thread는, take()를 사용해 새로운 큐 (JNotify가 파일을 보관 유지하는)에있는 파일을 찾고, 일단 수신하면, 그것을 처리하기 위해서 ThreadPoolExecutor에 건네줍니다. threadpoolexecutor는 작업자 스레드 세트를 유지 관리하고 명령을 실행합니다. 작업자 스레드는 단순히 파일을 구문 분석하고 데이터를 DB에 삽입합니다. 모든 것이 잘 작동하면 상태가 실패로 돌아갑니다. 이제이 스레드는 추가 처리를 위해 파일을 다른 차단 대기열 (예 : moverQueue)에 저장합니다.다중 스레드 파일 폴링
두 번째 악마 스레드는 take()를 사용하여이 이동기 큐를 풀링하고 일단 파일이 도착하면 처리를 위해 자체 Threadpoolexecutor에 전달합니다. 상태에 따라 파일이 별도의 위치로 이동됩니다. 이제 작업이 끝나면 스레드 풀을 모두 중지하므로 두 악마 스레드도 중지됩니다.
여기서 문제는 재시도 논리가 있고 복구 가능한 일부 처리가 실패 할 경우 파일이 재시도 횟수가 증가 된 새 대기열에 다시 저장된다는 것입니다.
내 작업이 끝났는지 그리고 스레드 풀을 종료해도 괜찮은지 결정할 수있는 우아한 방법을 찾지 못했습니다. 일부 파일이 실패 할 수 있으므로 파일 수에 의존 할 수 없습니다. 내 악마 스레드가 스레드 풀을 유지 관리하고 있기 때문에 작업 스레드에 의해 처리되는 재시도에 대해 전혀 몰라.
이 디자인 접근 방식이 좋든 싫든 해답을 제시하십시오. 한 번에 40K라고하는 파일이 너무 많습니다.
악마 스레드가 파일을 가져 와서 작업자 스레드로 전달하는 모든 수신 파일에 대한 대기열을 이미 유지 관리하고 있습니다. 파일 목록이 동일한 다른 집합을 유지할 것을 제안합니까? 실패 할 때 새 큐가 비게되면 executor를 확인하거나 종료 할 수 없습니다. 작업자 스레드가 새 큐에 파일을 다시 넣음으로써 다른 작업자 스레드가이를 처리 할 수 있습니다. 대기열이 비어 있지만 작업자 스레드가 stil 실행하고 실패의 경우 대기열에 다시 파일을 넣을 수 있습니다 .Queue는 비어있는 작업을 반영하지 않습니다 완료되었습니다 –