2017-02-09 7 views
0

Я новичок в Spring Batch, и я пытаюсь запустить команду сортировки linux после пакетного процесса, используя SystemCommandTasklet в качестве второго шага. Тем не менее, его бросание NullPointerException при сортировке больших файлов (что занимает некоторое время, около 250 МБ). Похоже, SystemCommandTasklet не может инициализировать StepExecution в beforeStep() и выбросить ошибку. Может ли кто-нибудь проверить мою конфигурацию и сообщить, если мне не хватает какой-либо конфигурации, которая вызывает это?Spring batch SystemCommandTasklet throwing null null Указатель исключения

BatchConfig.java

@Bean 
public Job job() throws Exception { 
    return jobs.get("job") 
      .incrementer(new RunIdIncrementer()) 
      .flow(step1()).on("FAILED").fail().on("COMPLETED").to(step2()) 
      .end() 
      .build(); 
} 

@Bean 
public Step step1() { 
    return steps.get("step1") 
      .<FileEntry,FileEntry>chunk(100) 
      .reader(reader()).faultTolerant().skipLimit(MAX_SKIP_LIMIT).skip(FlatFileParseException.class) 
      .processor(new Processor()) 
      .writer(compositeWriter()).stream(outputwriter()).stream(rejectwriter()) 
      .listener(new CustomStepExecutionListener()) 
      .build(); 
} 

@Bean 
public Step step2() throws Exception { 
    return steps.get("step2") 
      .tasklet(sortingTasklet()) 
      .build(); 
} 

@Bean 
@StepScope 
public Tasklet sortingTasklet() throws Exception { 
    SystemCommandTasklet tasklet = new SystemCommandTasklet(); 
    logger.debug("Sorting File : " + getOutputFileName()); 
    tasklet.setCommand(new String("sort " + getOutputFileName() + " -d -s -t \001 -k1,1 -o " + getOutputFileName() + ".sorted ")); 
    tasklet.setTimeout(600000l); 
    return tasklet; 
} 

Вот ссылка на SpringBatch исходный код для SystemCommandTasklet, его метания NullPointerException на линии 131.
https://github.com/spring-projects/spring-batch/blob/master/spring-batch-core/src/main/java/org/springframework/batch/core/step/tasklet/SystemCommandTasklet.java

ответ

0

Вы не регистрируете SystemCommandTaskletStepExecutionListener как и так как вы не возвращаете класс реализации по методу @Bean, Spring Batch не знает, что этот тасклет реализует этот интерфейс. Я бы рекомендовал две вещи, чтобы быть в безопасности:

  1. Изменить метод конфигурации тасклет Подпись быть: @Bean @StepScope public SystemCommandTasklet sortingTasklet() throws Exception {

  2. Зарегистрируйте тасклет в качестве слушателя на вашем шаге, а также, подобно тому, как вы» сделав это с помощью CustomStepExecutionListener.

+1

Благодарим вас за ответ. Теперь он отлично работает. Кроме того, я большой поклонник Spring Batch :) –

+0

@Mihael Minella, на каком этапе вы зарегистрировали бы эту роль в качестве слушателя? – mfunaro

+0

Шаг, на котором он используется. –