2017-01-30 12 views
1

私は春バッチを使用してジョブのジョブパラメータにアクセスすることに苦労しています。ここまでは私の実装です。ジョブパラメータへのアクセスSpringバッチ

@Configuration 
@EnableBatchProcessing 
@PropertySource("classpath:batch.properties") 
public class CSVBatchServiceImpl extends StepExecutionListenerSupport implements CSVBatchService { 
    private static final Logger LOGGER = LoggerFactory.getLogger(CSVBatchServiceImpl.class); 
    @Autowired 
    public JobBuilderFactory jobBuilderFactory; 
    @Autowired 
    public StepBuilderFactory stepBuilderFactory; 

    private QuestionReader questionReader = new QuestionReader(); 

    @Bean(name = "importQuestionsJob") 
    public Job importQuestionsJob() { 
     return jobBuilderFactory.get("importQuestionsJob") 
       .incrementer(new RunIdIncrementer()) 
       .flow(step1()) 
       .end() 
       .build(); 
    } 

    @Bean 
    public Step step1() { 
     return stepBuilderFactory.get("step1") 
       .<Question, Question>chunk(2) 
       .reader(questionReader.reader()) 
       .processor(processor()) 
       .build(); 
    } 

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

class QuestionReader extends StepExecutionListenerSupport { 
    private static final Logger LOGGER = LoggerFactory.getLogger(QuestionReader.class); 

    //TODO: remove this 
    private static JsonNode getJsonNode(String str) { 
     try { 
      ObjectMapper mapper = new ObjectMapper(); 
      return mapper.readTree(str); 
     } catch (IOException e) { 
      throw new RuntimeException(e); 
     } 
    } 

    @Bean 
    public FlatFileItemReader<Question> reader() { 
     FlatFileItemReader<Question> reader = new FlatFileItemReader<>(); 
     //TODO get this as a parameter 
     reader.setResource(new ClassPathResource("duplicateLabels.csv")); 
     reader.setLinesToSkip(1); 
     reader.setLineMapper(new DefaultLineMapper<Question>() {{ 
      setLineTokenizer((new DelimitedLineTokenizer() {{ 
       setNames(new String[]{"label", "body", "real_answer"}); 
      }})); 
      setFieldSetMapper(new QuestionFieldSetMapper()); 
     }}); 
     return reader; 
    } 

    private static class QuestionFieldSetMapper implements FieldSetMapper<Question> { 
     public Question mapFieldSet(FieldSet fieldSet) { 
      Question question = new Question(); 
      question.setLabel(fieldSet.readString(0)); 
      question.setBody(getJsonNode(fieldSet.readString(1))); 
      question.setRealAnswer(getJsonNode(fieldSet.readString(2))); 
      return question; 
     } 
    } 
} 

私のような仕事を呼び出しています:

JobParameters parameters = new JobParametersBuilder() 
     .addLong("time", System.currentTimeMillis()) 
     .addString("filePath", "file.csv") 
     .toJobParameters(); 
jobLauncher.run(importQuestionsJob, parameters); 

私はリーダー関数内FilePathパラメーターへのアクセスについてどのように行くことができますか?

答えて

1

あなたが行うことができるはず、

@Value("#{jobParameters['filePath']}") String filePath; 

は、すべての問題の場合は、あなたは@StepScopeであなたのリーダーを入れてみてください。

+1

範囲を設定することが動作しませんせずにこれを使用して必須です。 –

+0

コードをどこに追加できるか教えていただけたら本当に感謝します。 – Putty

+1

あなたは 'reader()'メソッドでそれを必要とするので、 'reader(@Value("#{jobParameters ['filePath']} ")String filePath)'のようなリーダーのシグネチャを変更することができます。 '@ StepScope'で'読者 'に読んでください。ステップ定義では、 'questionReader.reader(null)'のようにこのパラメータに 'null'を渡すことができます。 –

0

org.springframework.batch.core.listener.JobParameterExecutionContextCopyListenerをステップに追加することができます。 ItemReaderのオープンとアップデート方法でリスナーが使用可能であることExecutionContextJobParametersをコピーします

TaskletStep step = stepBuilderFactory.get("my-best-step") .<Item, Item>chunk(10) .reader(myBestReader) .writer(myBestWriter) .listener(new JobParameterExecutionContextCopyListener()) .build();

関連する問題