2017-11-13 11 views
0

필자는 시장 데이터를 쓰고 읽는 데 크로니클 4.5.27을 사용하고 있습니다. 나는 한 명의 작가이지만 여러 명의 독자가있다. 개발 OS는 Windows이고 Prod 배포를 위해서는 Linux가 뒤 따른다.크로니클 대기열 - 모든 소비자가 읽을 수있는 경우 마지막 읽기 위치에서 읽고 파일을 삭제합니다.

다음 사례를 구현하는 방법은 무엇입니까?

  1. 마지막 읽기 위치에서 큐 읽기를 시작하는 방법은 무엇입니까? 예 : 독자가 100 개의 레코드가있는 파일에서 15 개의 레코드를 읽었고 다음에 다시 시작될 때 16 번째 레코드에서 읽기 시작하는 방법을 중단하거나 중지 한 경우? CQ에 내장 된 내구성 지원이 있습니까?
  2. 디스크 공간을 절약하기 위해 모든 사용자가 읽는 파일을 삭제하십시오.

이 내용은 구현되었지만 열린 문제로 인해 파일이 Windows에서 삭제되지 않은 것으로 보입니다. 모든 관심있는 소비자가 진행하는 경우에만 파일을 삭제할 수있는 CQ의 구축 지원이 있습니까?

public static long readMarketData(String pathForMarketDataFile, long indexFrom) { 
SingleChronicleQueue queue = SingleChronicleQueueBuilder.binary(pathForMarketDataFile).rollCycle(RollCycles.MINUTELY).storeFileListener(new StoreFileListener() { 
    @Override 
    public void onReleased(int i, File file) { 
     System.out.println("File is not in use and is ready for deletion: " + file.getName()); 
     try { 
      file.delete(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     ; 
     System.out.println("File deleted: " + file.getName()); 
    } 

    @Override 
    public void onAcquired(int cycle, File file) { 
     System.out.println("File is use for reading: " + file.getName()); 
    } 
}).build(); 

이 주제에 대한 블로그 및 게시물을 거의 읽지 않았습니다. 여전히

https://groups.google.com/forum/#!topic/java-chronicle/0Nz5P-nvLgM

그러나

https://vanilla-java.github.io/2016/03/29/Microservices-in-the-Chronicle-world-Part-4.html

어느 한이 사용 사례를 구현하고 있는지 알고 싶습니다.

답변

0

소비자 최고 수위 추적은 MessageHistory을 사용하여 수행되지만 소비자가 출력 대기열에 출력을 쓰는 것이 필수적입니다 (기본적으로 소비자 읽기 시퀀스가 ​​출력 대기열에 저장 됨).

또는 소비자가 본 가장 높은 순서 (색인)를 기록하기위한 자체 메커니즘을 구현해야합니다.

파일 삭제와 관련하여 열린 파일 핸들을 대기열 파일에 보관하는 다른 프로세스가있을 수 있습니다. reader-A가 더 이상 큐 파일 15.cq4를 사용하지 않으면 코드는 file.delete()를 호출하려고 시도하지만 reader-B는 여전히 해당 파일에 대한 참조를 가지고 있으므로 삭제되지 않습니다.

더 강력한 정책은 모든 독자가 처리를 마친 후 파일을 삭제할 책임이있는 다른 서비스/프로세스에 대해 각 독자로부터 일정한 종류의 이벤트를 갖는 것입니다.

+0

참고 : 창에는 파일이 매핑되지 않은 경우에도 프로그램이 종료 될 때까지 삭제되지 않을 수있는 문제가 있습니다. Linux/MacOSX에는이 문제가 없습니다. –

+0

감사 마크와 피터. 내가 마지막으로 레코드를 읽고 자신의 기록 메커니즘을 구현하고 Windows에서 파일을 삭제하기 위해 나는 활성 스레드에서 나온 다음 주기적으로 파일을 삭제해야합니다. – AmbGup