2017-09-28 6 views
1

두 개의 Java 응용 프로그램이 들어오는 파일의 디렉토리를보고있는 상황이 있습니다. 확장자가 .SGL 인 파일에 대해 두 개의 JVM 프로세스가 감시하는 디렉토리 DIR이 있다고 가정하십시오.들어오는 파일에 대한 단일 디렉토리를보고있는 여러 JVM이있는 Java 파일 감시자

여기서 우리가 직면하는 문제는 두 노드가 모두 새 파일에 대한 알림을 받고 두 노드가 모두 같은 파일을 처리하려고하는 경우입니다.

일반적으로 고유 한 파일 이름 열이있는 테이블에 삽입하려고하는 데이터베이스를 사용하여 이러한 상황을 처리하며 하나만 성공하고 처리를 계속합니다.

그러나 이러한 상황에서는 데이터베이스가 없습니다.

이러한 종류의 문제를 처리하는 가장 좋은 방법은 무엇입니까? 우리는 파일 이름 바꾸기 솔루션에 의존 할 수 있습니까? 파일 이름 바꾸기가 원자 적 연산입니까?

답변

1

모든 감시자 (동일한 JVM에서 2 개)는 항상 추가되는 새 파일을 통지 받아야합니다. 당신이 일을 분할하려면

, 당신도

  • 사용하는 하나의 JVM은 두 배나 많은 스레드를 실행하고 큐를 통해 작업을 분할 할 수 있습니다.
  • 은 하나의 JVM에서만 성공할 작업을 사용합니다. 예 :
    • 파일은
    • 파일 자체를 잠금
    • 는 잠금 파일을 만들어 이름을 변경

파일 이름 바꾸기 원자 연산이다인가?

예, 둘 다 동일한 이름으로 이름을 바꾸려고해도 예를 들어 하나의 프로세스 만 파일의 이름을 바꿀 수 있습니다. 이러한 상황 봄 통합을위한

1

FileSystemPersistentAcceptOnceFileListFilter 제안하십시오 MetadataStore에있는 파일 "볼"https://docs.spring.io/spring-integration/reference/html/files.html#file-reading

  • 상점은 응용 프로그램이 다시 시작 살아남을 수 있습니다.
  • 기본 키는 '접두어'와 절대 파일 이름입니다. value는 파일의 타임 스탬프입니다.
  • 파일이 저장소에 있고 이미 현재 파일과 동일한 수정 된 시간이
  • 인 경우 파일은 이미 '본 것으로'간주됩니다.

모든 응용 프로그램 인스턴스에 대한 MetadataStore 영구 공유 한 경우에만 그 중 하나는 파일을 처리합니다. 다른 모든 사람들은 그냥 필터링합니다.