2017-12-27 17 views
1

CSV 파일을 읽고 화면에 선을 쓰려면 Spring Batch를 사용하고 있습니다. 내 직업은 3 부분으로 구성됩니다. 1 부 : 내 디스크의 일부 INPUT 디렉토리에 CSV 파일이 있는지 확인하고, TRUE를 반환하면 파일이 PROD라는 다른 디렉토리로 이동합니다. 2 부 : FlatFileItemReader를 사용하여 CSV 파일에서 데이터 추출. 3 부 : 모든 항목을 화면에 씁니다.파일을 이동 한 후 FlatFileItemReader에 대한 Unfound 리소스

문제는 FlatFileItemReader가 org.springframework.batch.item.ItemStreamException: Failed to initialize the reader 여기

java.lang.IllegalArgumentException: Input resource must be set에 의한 던졌습니다 것은 내 코드입니다 :

사실
@Bean 
public FlatFileItemReader<UniversInvestissement> reader() { 
    FlatFileItemReader<UniversInvestissement> reader = new FlatFileItemReader<>(); 
    File csvFile = new File("C://INPUT/data.csv"); 
    Resource resource = resourceLoader.getResource("file:" + csvFile.getAbsolutePath()); 
    reader.setLinesToSkip(1); 
    reader.setResource(resource); 
    DefaultLineMapper lineMapper = new DefaultLineMapper(); 

    DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer(); 
    tokenizer.setNames(new String[]{"COL1", "COL2", "COL3", "COL4"}); 
    tokenizer.setDelimiter(";"); 

    FieldSetMapper fieldSetMapper = new UniversInvestissementFieldSetMapper(); 
    lineMapper.setLineTokenizer(tokenizer); 
    lineMapper.setFieldSetMapper(fieldSetMapper); 

    reader.setLineMapper(lineMapper); 

    reader.setEncoding("Cp1252"); 
    return reader; 
} 

@Bean 
public UniversInvestissementWriter writer() { 
    return new UniversInvestissementWriter(); 
} 

@Bean 
public UniversInvestissementProcessor processor() { 
    return new UniversInvestissementProcessor(); 
} 

@Bean 
public Step extractData() { 
    return steps.get("extractData") 
      .<UniversInvestissement, UniversInvestissementProcessorResult>chunk(1) 
      .reader(reader()) 
      .processor(processor()) 
      .writer(writer()) 
      .build(); 
} 

문제 FlatFileItemReader가 초기화 될 때 그것으로 CSV 파일을 찾을 수 있다는 것입니다 리소스! 리소스 할당을 연기하고이 예외를 피할 수있는 방법이 있습니까?

+0

[태그 : 배치 파일] 태그는 많은 파일을 처리하는 것이 아닙니다. 태그 위에 마우스를 올려 놓으면 실제 의미를 볼 수 있습니다. – SteveFest

+0

@SteveFest, 네 말이 맞아. 하지만 자동으로 제안되어서 나는 그것을 모았습니다. 나는 같은 맥락이 아닌 것을 알지 못했습니다;) 어쨌든 고마워요. –

+0

답장을 보내 주셔서 감사합니다. 잘못된 "자동 수정"사례를 보는 것은 얼마나 슬픈 일입니다. – SteveFest

답변

0

사용할 수 있습니다. reader.setStrict(false); 엄격 모드를 false로 설정하면 리더가 예외를 throw하지 않습니다.. 독자를 게으르게 만들려면 @StepScope을 사용해야 할 수도 있습니다. 내가 같은 설정을 사용하고 그것은 나를 위해 잘 작동하고, 희망이 CSV 파일 내 디스크에 일부 INPUT 디렉토리에 존재하는 경우이 파일이라는 또 다른 디렉토리로 이동합니다 TRUE를 반환 경우, 확인 당신에게

+0

엄격 모드를 false로 설정 한 후에는 더 이상 예외는 없지만 독자가 null 리소스로 초기화되어 내 CSV를 읽지 못하는 문제가 있습니다. ( –

+0

@stepscope을 사용하여 독자를 게으르게 만들 필요가 있습니다 – Niraj

0

을하는 데 도움이 PROD는

이 문제는 easly을 programm의 사용을 삽입 할 물론 JobExecutionDecider

class Checker implements JobExecutionDecider { 
    FlowExecutionStatus decide(...) { 
    if(<file not found in INPUT/ dir>) { 
     return FlowExecutionStatus.STOPPED; 
    } 
    if(!<copy file from INPUT/ to PROD/ works>) { 
     return FlowExecutionStatus.FAILED; 
    } 
    return FlowExecutionStatus.COMPLETED; 
    } 
} 

, extractData() 변경해야을 사용하여 해결 될 수있다 atic 흐름 결정 (간단한 예를 들어 here 확인)

0

그 예외는 리소스 인스턴스의 null이 아닌 주장에 의해 던져 졌으므로 귀하의 resourceLoader에있는 문제라고 생각합니다. 그래서 resourceLoader null 값을 반환합니다.

FileSystemResource을 사용하고 리소스 로더를 사용하지 않도록하십시오. 예 :

reader.setResource(new FileSystemResource(csvFile));