2017-01-30 4 views
1

Я боролся с доступом к параметрам задания задания, используя весеннюю партию. Вот моя реализация до сих пор.Доступ к параметрам работы Весенняя партия

@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'. В определении шага вы можете передать 'null' для этого параметра, например,' questionReader.reader (null) '. –

0

Вы можете добавить org.springframework.batch.core.listener.JobParameterExecutionContextCopyListener в свой Шаг.

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

Это Слушатель будет копировать JobParameters в ExecutionContext, который доступен в ItemReader в открытых и обновления методов