2017-01-19 1 views
0

The default flush interval is 30000. 왜 스케줄링하기 전에 FileWritingMessageHandler divide this interval by 3의 시작 메소드를 사용합니까?FileWritingMessageHandler의 APPEND_NO_FLUSH는 어떻게 작동합니까?

다음 스트림을 생성하여 spring-cloud-dataflow 프로젝트로 플러시를 테스트 해 보았습니다 : 'time | file --mode = APPEND_NO_FLUSH --directory = test '

예상 결과 : 30 초 후에 파일에 기록 된 30 개의 메시지를 참조하십시오.

실제 결과 : 0 개의 메시지가 파일에 기록됩니다.

답변

1

간격보다 자주 실행되도록 플러셔를 예약해야합니다. 그렇지 않으면 플러시가 간격을 2x 걸릴 수 있습니다 (00:00:01에 레코드를 작성한다고 가정 해 봅시다) 파일은 00:01:00까지 플러시되지 않습니다).

간격/3에서 플러 셔를 실행하면 실제 간격은 3 ~ 4 회 정도가됩니다.

30 초 간격으로 실제 간격은 30 초에서 40 초 사이이며 평균적으로 35 초입니다.

더 정확하게하려면 플러시를 훨씬 더 자주 실행해야합니다.

자바 문서에서 알고리즘을 명확히해야합니다.

EDIT

08 : 44 : 01.578 [주] DEBUG osichannel.DirectChannel - postSend 채널의 입력 "ON (= 참 전송) 메시지 : GenericMessage [페이로드 =이 다른 테스트입니다 헤더 = {타임 스탬프 = 1484919841573, ID = ac106489-73ad-da18-791d-3d0ec515c567, DIR = 표현}]

08 : 44 : 41.509 [태스크 스케줄러-3] DEBUG의 osifile.FileWritingMessageHandler - 플러시 :/var에 /folders/rl/6ys7s69j2tqcjyvy8thdsd7m0000gp/T/dataflow-tests/expression/this.out

+0

이것은 [참조 설명서] (http://docs.spring.io/spring-integration/reference/html/files.html#file-flushing)에서 이미 설명되어 있습니다. flushInterval - 파일이 기록되지 않은 경우 이 기간 동안 자동으로 플러시됩니다. 이것은 근사치이며 이번에는 1.33x까지 올 수도 있습니다. ' –

+0

감사합니다. 그래서, 다음과 같은 스트림에서 매 30-40 초마다 파일로 메시지를 플러시하고 싶다면 'time | file --mode = APPEND_NO_FLUSH --directory = test '사용자 정의 FlushPredicate를 작성해야합니까? – aturkovic

+0

아니요; 당신은 술어가 필요 없다. DEBUG 로깅을 켜면 플러시가 표시됩니다. 내 대답을 편집하십시오. –

관련 문제