2016-06-22 4 views
0

Ich konfigurierte einen Job, der aus einer Tabelle liest, einige Zeichenfolge übergeben und verwendet dann einen @ Dienst, um Daten in einer Redis-Instanz zu speichern.Spring Batch nach Job ist Status abgeschlossen, es wird immer wieder gestartet

Der Auftrag wird abgeschlossen, wie Sie sehen können:

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

Parameter: [{time = 2016-06-22T08: 46: 09.001}] und die folgenden Status: [BEENDET]

und dann wird es gestartet wieder und wieder wie in einer Schleife:

INFO ScheduledTasks - Sch Lauf EduLed Aufgabe [ populateCacheWithCalendarData] 25438: INFO SimpleJobLauncher - Beruf: [Flowjob: [name = populateCacheWithCalendarData]] mit den folgenden Parametern gestartet: [{time = 2016-06-22T08: 46: 10}]

ich habe eine geplante Aufgabe wie folgt konfiguriert:

@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()); 
    } 
} 

Die Job-Konfiguration:

@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(); 
    } 
} 

Prozessor und Schriftsteller :

@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); 
    } 
} 

Die Hauptanwendung für alle Fälle:

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

    public static void main(String[] args) { 

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

Ich habe keine Ahnung, warum es tut das, weil nach einiger langen Zeit stoppt.

Vielen Dank im Voraus

Antwort

0

das Problem war, dass die * 's die Planer machen den Job jede Sekunde starten, auf jede Minute und Sohn. Ich ersetze es für:

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

Ich hoffe, dies könnte einige andere helfen

Verwandte Themen