2016-01-19 7 views
1

Мои требования: создать планировщик для периодического вызова партии, и внутри пакета мне нужно выполнить два шага. StepA начнет работать и, соответственно, будет исходить, будет вызван StepB. Если вы посмотрите на журнал консоли, вы увидите, что stepA вызывается несколько раз, скажем, в тот же момент. Согласно @Scheduled (fixedRate = 60000), в каждую минуту должен быть только один вызов. Iguess, что проблема не имеет отношения к Scheduller, так как я удалил планирование и столкнулся с аналогичной проблемой. Другая связанная с этим проблема заключается в том, что StepB никогда не вызывается. Я попытался создать customDecider ("... next (customDecider()") и создать частный метод для возврата JobExecutionDecider. Кажется, что оба они не вступили в силу вообще. Мое лучшее предположение, что пул-поток в результате чего некоторые «бесконечного цикла» в Степе, потому что я не сделал установки что-то правильно, но я не нашел, что может быть.Весенняя партия с двумя шагами в потоке. Почему второй шаг никогда не запускается и первый шаг в бесконечном цикле

BatchConfig.java

/*@Bean 
    public JobExecutionDecider customDecider() throws Exception{ 
      return new CustomDecider(); 
    }*/ 

    private JobExecutionDecider decider(boolean decision){ 
      return(jobExecution, stepExecution) -> new FlowExecutionStatus(decision ? "OK" : "FAILED"); 
    } 


    @Bean 
    public Job job(Step stepA, Step stepB) { 
      return jobBuilderFactory.get("job1") 
         //.flow(stepA).on("FAILED").to(stepB).end().build(); 
         .start(stepA).next(decider(true)).on("FAILED").stop().from(stepA).next(stepB).build().build(); 

    } 

    @Bean 
    public Step stepA(ItemReader<String> readerA, ItemWriter<String> writerA) { 
      return stepBuilderFactory.get("stepA").<String, String> chunk(1) 
         .reader(readerA).writer(writerA).allowStartIfComplete(true) 
         .build(); 

    } 

    @Bean 
    @StepScope 
    public ItemReader<String> readerA() { 
      return new CustomItemReaderA(); 

    } 

    @Bean 
    public ItemWriter<String> writerA() { 
      return new CustomItemWriterA(); 

    } 

    @Bean 
    public Step stepB(ItemReader<String> readerB, ItemWriter<String> writerB) { 
      return stepBuilderFactory.get("stepB").<String, String> chunk(1) 
         .reader(readerB).writer(writerB).allowStartIfComplete(true) 
         .build(); 

    } 

    @Bean 
    @StepScope 
    public ItemReader<String> readerB() { 
      return new CustomItemReaderB(); 

    } 

    @Bean 
    public ItemWriter<String> writerB() { 
      return new CustomItemWriterB(); 

    } 

CustomDecider.java

public class CustomDecider implements JobExecutionDecider { 


     @Override 
     public FlowExecutionStatus decide(JobExecution jobExecution, 
        StepExecution stepExecution) { 
       return new FlowExecutionStatus("OK"); 
     } 

} 

CustomItemReaderA 

public class CustomItemReaderA implements ItemReader<String>{ 

     private static final Logger log = LoggerFactory.getLogger(CustomItemReaderA.class); 
     @Override 
     public String read() throws Exception, UnexpectedInputException, 
        ParseException, NonTransientResourceException { 
       log.info("rA"); 
       return "A"; 
     } 

} 

CustomItemWriterA 
public class CustomItemWriterA implements ItemWriter<String> { 

     private static final Logger log = LoggerFactory.getLogger(CustomItemWriterA.class); 
     @Override 
     public void write(List<? extends String> items) throws Exception { 
       log.info("wA"); 

     } 

} 

CustomItemReaderB и CustomItemReaderB идентичны Польз ... Справедливое меняется от А до Б буквы во log.info и вернуть

Console Log

2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
and so on ... 

планировщик

@Component 
public class QueueScheduler { 

     private static final Logger log = LoggerFactory 
        .getLogger(QueueScheduler.class); 

    private Job job; 
    private JobLauncher jobLauncher; 

    @Autowired 
    public QueueScheduler(JobLauncher jobLauncher, @Qualifier("job") Job job){ 
     this.job = job; 
     this.jobLauncher = jobLauncher; 
    } 



    @Scheduled(fixedRate=60000) 
    public void runJob(){ 
      try{ 
     jobLauncher.run(job, new JobParameters()); 
      }catch(Exception ex){ 
       log.info(ex.getMessage()); 
      } 
    } 
} 

ответ

2

Проблема с вашим CustomItemReaderA. Вы должны сообщить читателю, когда прекратите «чтение» данных. Если вы измените читатель, как указано ниже, выполнение произойдет так, как ожидалось.

public class CustomItemReaderA implements ItemReader<String> { 
    private static final Logger log = LoggerFactory 
      .getLogger(CustomItemReaderA.class); 
    private int readCount = 0; 

    @Override 
    public String read() throws Exception, UnexpectedInputException, 
      ParseException, NonTransientResourceException { 
     log.info("Inside CustomItemReaderA"); 
     if (readCount == 1) { 
      return null; 
     } 
     readCount++; 
     return "Read CustomItemReaderA"; 
    } 
} 
+0

Итак, путем возврата null единственный способ остановить CustomItemReaderA? Во избежание повторных вызовов (второй только для возврата null) я могу создать логику, чтобы вернуть значение null, если первый раз был успешным. Если ItemReader был спроектирован с такой идеей, это нормально для этого сценария, но, скажем, был CustomItemProcessorA, ожидающий, что прочитанные данные из CustomItemReaderA и CustomItemWriterA, ожидающие обработки данных из CustomItemReaderB, не возвратят нулевой разрыв цели такой партии или заставить меня сделать уродливое обходное решение? Или нужно читать хотя бы дважды? –

+0

Другие сомнения очень близки последнему: по моему требованию, я должен принять решение в соответствии с CustomItemReaderA, если будет вызван CustomItemReaderB. Для этого я понимаю, что мне нужно каким-то образом использовать JobExecutionDecider и решить его с помощью ... on (FlowExecutionStatus). Как я могу изменить статус из CustomItemReaderA? Ну, думая только о двух вариантах (неудачно или не удалось), я мог бы использовать return null для успешной работы и исключить исключение для отказа. Но, давайте подумаем в трех вариантах? Как вернуть один из трех статусов из CustomItemReaderA? Могу ли я изменить FlowExecutionStatus из CustomItemReaderA? –

+0

Я по-прежнему смотрю эту тему часто. –