2014-09-25 3 views
1

내가 가진 것들?스프링 배치 ~ 동적 커밋주기 또는 사용자 정의 완료 정책

새로운 CSV 파일에 대한 폴더를 재귀 적으로 볼 수있는 Spring 통합. Spring 배치로 다시 보냅니다.

작업 : CSV 파일을 읽습니다. 프로세서에서 항목의 일부 데이터를 수정합니다. DB에 내 데이터를 저장하기 위해 커스텀 작가를 사용합니다.

문제가 있습니까?

실제로 동적 인 CSV beeing이 배치에 전송됩니다. 내 커밋 간격은 CSV 파일에있는 항목 (줄)의 수를 기준으로합니다. 다른 방법으로는, 모든 고정 된 수의 항목에서 내 데이터를 커밋하고 싶지는 않지만 모든 파일 끝. 예 : CSV 1에 200 개의 라인이 있고, 모든 라인을 처리하고, 쓰고, 커밋하고, 트랜잭션을 닫은 후 다음 CSV를 읽으려고합니다.

나는이 개 아이디어를 가지고,하지만 난 완벽 whoch 몰랐다 그것을 구현하는 방법 :

  1. 독자로부터 내 CSV의 행 수를 확인하고 사용하여 내 커밋 간격으로 보내 그래서 같은 직업 매개 변수 인수 #{jobParameters['commit.interval.value']}
  2. 내 커밋을 대체하는 사용자 정의 완료 정책 구현, 구현 방법 isComplete() 어떤 예가 있습니까? Github 프로젝트?

하지만 그 전에는 항목 수를 어떻게 알 수 있습니까?

아무도 도와 줄 수 있습니까? 아마 코드 샘플?

미리 감사드립니다.

답변

3

응답 없음,하지만 난이 동적 대신 완료 정책의 간격 커밋 사용하고있는 솔루션

을 발견했다.

봄 일괄 통합으로

, 나는 나를 카운트 라인을 얻을하는 데 도움이 기능을 추가 하나에 그것을 위해 나는 사용자 정의 클래스 FileMessageToJobRequest가, 배치에 내 파일을 보내 변압기를 사용할 수 있습니다

public static int countLines(String filename) throws IOException { 
    InputStream is = new BufferedInputStream(new FileInputStream(filename)); 
    try { 
     byte[] c = new byte[1024]; 
     int count = 0; 
     int readChars = 0; 
     boolean empty = true; 
     while ((readChars = is.read(c)) != -1) { 
      empty = false; 
      for (int i = 0; i < readChars; ++i) { 
       if (c[i] == '\n') { 
        ++count; 
       } 
      } 
     } 
     return (count == 0 && !empty) ? 1 : count; 
    } finally { 
     is.close(); 
    } 
} 

이 하나 보낼 수있는 매개 변수

@Transformer 
public JobLaunchRequest toRequest(Message<File> message) throws IOException{ 

    JobParametersBuilder jobParametersBuilder = new JobParametersBuilder(); 

    jobParametersBuilder.addString("commit.interval", Integer.toString(countLines(message.getPayload().getAbsolutePath()))); 

    return new JobLaunchRequest(job, jobParametersBuilder.toJobParameters()); 
} 

내 작업의 맥락에서, 난 그냥이 commit-interval="#{jobParameters['commit.interval']}"

이 희망 추가 도움이 필요한 사람을 도우 라.)

관련 문제