Весенняя партия после того, как задание завершено, запускается снова и снова

Я настроил задание, которое считывает данные из таблицы, передает некоторую строку, а затем использует @service для хранения данных в экземпляре Redis.

Как видите, работа завершена:

INFO  SimpleJobLauncher - Job: [FlowJob: [name=populateCacheWithCalendarData]] completed with the following

параметры: [{time=2016-06-22T08:46:09.001}] и следующий статус: [ЗАВЕРШЕНО]

А потом запускается снова и снова как в цикле:

ИНФОРМАЦИЯ ScheduledTasks — Запуск запланированной задачи [ populateCacheWithCalendarData ] 25438: ИНФОРМАЦИЯ SimpleJobLauncher — Задание: [FlowJob: [name=populateCacheWithCalendarData]] запущено со следующими параметрами: [{time=2016-06-22T08:46:10}]

У меня есть запланированная задача, настроенная следующим образом:

@Slf4j
@Component
public class ScheduledTasks {

   @Autowired
   JobLauncher jobLauncher;

   @Autowired
   JobRegistry jobRegistry;

   // scheduled every 14 hours
   @Scheduled(cron = "* * */1 * * *")
   public void doPopulateCacheWithCalendarDataJob()
           throws NoSuchJobException, JobParametersInvalidException, JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException {

      // given
      log.info("Running Scheduled task [ populateCacheWithCalendarData ]");
      Job calendarJob = jobRegistry.getJob("populateCacheWithCalendarData");
      JobParametersBuilder paramsBuilder = new JobParametersBuilder().addString("time", LocalDateTime.now().toString());

      // then
      jobLauncher.run(calendarJob, paramsBuilder.toJobParameters());
   }
}

Конфигурация работы:

@Configuration
@EnableBatchProcessing
public class CalendarBatchConfiguration extends AbstractBatchConfiguration {

   @Bean
   public Job populateCacheWithCalendarData() {

      return jobBuilderFactory.get("populateCacheWithCalendarData")
              .incrementer(new RunIdIncrementer())
              .flow(calendarStep1())
              .end()
              .build();
   }


   /**
    * Look up hotel tickers and creates a csv file with them.
    *
    * @return ariStep1
    */
   @Bean
   public Step calendarStep1() {

      return stepBuilderFactory.get("calendarStep1")
              .<Hotel, String>chunk(100)
              .reader(calendarReader())
              .processor(calendarProcessor())
              .writer(calendarWriter2())
              .build();
   }

@Bean
   public JdbcCursorItemReader<Hotel> calendarReader() {

      JdbcCursorItemReader<Hotel> reader = new JdbcCursorItemReader<>();
      reader.setSql("SELECT identificador, es_demo FROM instanciasaplicaciones WHERE es_demo = 0 AND version = 6");
      reader.setDataSource(this.dataSource);
      reader.setRowMapper((resultSet, i) -> new Hotel(resultSet.getString("identificador"), resultSet.getString("es_demo")));


      return reader;
   }


   @Bean
   public HotelItemProcessor calendarProcessor() {

      return new HotelItemProcessor();
   }

@Bean
   public CalendarItemWriter calendarWriter2() {

      return new CalendarItemWriter();
   }
}

Процессор и писатель:

@Slf4j
public class CalendarItemProcessor implements ItemProcessor<String, String> {

   @Override
   public String process(String item) throws Exception {

      log.info("Processing calendar hotel Ticker [" + item + "]");

      return item;
   }
}

@Slf4j
public class CalendarItemWriter implements ItemWriter<String> {

   @Autowired
   private CalendarService calendarService;


   @Override
   public void write(List<? extends String> hotelTickers) throws Exception {

      log.info("Creating calendar entry in Cache for items... ", hotelTickers.toString());

      hotelTickers.forEach(this::createOrUpdateCache);
   }


   /**
    * Use service to store calendar values into the cache.
    *
    * @param hotelTicker hotelTicker
    */
   private void createOrUpdateCache(String hotelTicker) {
      // store calendar ari values
      calendarService.createOrUpdateCalendarByHotelTicker(hotelTicker);
   }
}

Основное приложение на всякий случай:

/**
 * Main entry point for the Application.
 */
@EnableScheduling
@EnableTransactionManagement
@SpringBootApplication
public class Application {

   public static void main(String[] args) {

      SpringApplication.run(Application.class, args);
   }
}

Я понятия не имею, почему он это делает, потому что через некоторое время он останавливается.

заранее спасибо


person Roaslin    schedule 22.06.2016    source источник


Ответы (1)


проблема заключалась в том, что * заставляет планировщик запускать задание каждую секунду, каждую минуту и ​​далее. Я заменяю его на:

 @Scheduled(cron = "0 0 */14 * * *")

Я надеюсь, что это может помочь некоторым другим

person Roaslin    schedule 13.09.2016