Fórum Como integrar spring batch+spring boot+quartz #574274
27/01/2017
0
Atualmente em meu projeto estou utilizando spring boot e spring batch.
Criar o batch foi fácil, até mesmo executá-lo ao iniciar a aplicação com o tomcat embebed do spring boot porém, preciso executar esse batch de tempos em tempos.
A solução que me vem a mente é utilizar o quartz pra executar esse batch, porém não estou obtendo sucesso com essa integração..
Alguém pode me ajudar com algum exemplo?
Leandro Silva
Curtir tópico
+ 0Post mais votado
27/01/2017
Poderia dar uma lida no documento do Spring que explica sobre execução e agendamento de tarefas:
Task Execution and Scheduling - Integration
E aqui um exemplo de uso: Scheduling Tasks - Getting Started
Espero ter ajudado. Bom estudos !
Angelo Santos
Gostei + 1
Mais Posts
27/01/2017
Leandro Silva
Eu vi essa documentação e consigo agendar a execução de tarefas chamando pojos, porém o que tenho que fazer é executar um batch implementado com spring-batch de tempos em tempos.
No spring batch tudo se inicia no job, levando em consideração a documentação informada, bastaria eu chamar um metodo no meu pojo ao disparar o gatilho do quartz, porém fiquei um pouco perdido em como resolver isso com spring-batch configurando através de programação java no spring boot.
exemplo do meu batch:
@Bean
@Scheduled(fixedDelay=5000)
public Job importJob() {
log.debug("Iniciando scheduler "+new SimpleDateFormat("dd/MM/yyyy HH:mm:ss.S").format(new Date()));
Job job = jobBuilderFactory.get("Job")
.start(step1())
.build();
return job;
}
@Bean
public Step step1() {
return stepBuilderFactory.get("step1").<Pojo, Pojo>chunk(10).reader(reader())
.processor(processor()).writer(writer()).build();
}
@Bean
public FlatFileItemReader<Pojo> reader() {
FlatFileItemReader<Pojo> reader = new FlatFileItemReader<Pojo>();
reader.setResource(new ClassPathResource("sample-data.json"));
reader.setLineMapper(new LineMapper<Pojo>() {
private final Logger log = LoggerFactory.getLogger(this.getClass());
public PojomapLine(String line, int lineNumber) throws Exception {
log.info("Iniciando o mapeamento json -> Pojo");
Map<String, Object> sgvasPojoEntityAsMap = new JsonLineMapper().mapLine(line, lineNumber);
Pojo pojo = new pojo();
return pojo;
}
});
return reader;
}
@Bean
public ItemProcessor<Pojo, Pojo> processor() {
return new ItemProcessor<Pojo, Pojo>() {
private final Logger log = LoggerFactory.getLogger(this.getClass());
@Override
public Pojo process(Pojo pojo) throws Exception {
log.info("Processamento do item");
return pojo;
}
};
}
// end::readerwriterprocessor[]
@Bean
public JobExecutionListenerSupport jobCompletionNotificationListener() {
return new JobExecutionListenerSupport() {
private final Logger log = LoggerFactory.getLogger(this.getClass());
@Override
public void afterJob(JobExecution jobExecution) {
log.info("execução após o termino do job");
if (jobExecution.getStatus() == BatchStatus.COMPLETED) {
log.info("!!! JOB FINISHED! Time to verify the results");
} else if(jobExecution.getStatus() == BatchStatus.FAILED){
log.warn("Job executado com erros, por favor analise os logs!");
}
}
};
}
// tag::jobstep[]
/* @Bean
public Job importPojoJob(JobExecutionListenerSupport listener) {
FlowJob build = (FlowJob) jobBuilderFactory.get("PojoJob").incrementer(new RunIdIncrementer()).listener(listener)
.flow(step1()).end().build();
build.setRestartable(true);
return build;
}*/
@Bean
public ItemWriter<Pojo> writer() {
return new ItemWriter<Pojo>() {
private final Logger log = LoggerFactory.getLogger(this.getClass());
@Autowired
private RestTemplate restTemplate;
@Override
public void write(List<? extends Pojo> arg0) throws Exception {
log.debug("Entrando no método write(List<? extends Pojo> arg0) throws Exception");
for (Pojo pojo: arg0) {
String retorno = restTemplate.postForObject(restUrlBonusConceder, pojo, String.class);
log.debug(retorno);
}
}
};
}Gostei + 0
27/01/2017
Leandro Silva
Poderia dar uma lida no documento do Spring que explica sobre execução e agendamento de tarefas:
Task Execution and Scheduling - Integration
E aqui um exemplo de uso: Scheduling Tasks - Getting Started
Espero ter ajudado. Bom estudos !
Consegui resolver.
Deixei meu scheduler como abaixo:
@Scheduled(initialDelay = 5000, fixedRate = 5000)
public void reportCurrentTime() {
log.info("The time is now {}", dateFormat.format(new Date()));
try {
JobParameters jobParameters = new JobParametersBuilder().addLong("time", System.currentTimeMillis()).toJobParameters();
JobExecution jobExecution = jobLauncher.run(importPojoJob, jobParameters);
log.info(jobExecution.getStatus().toString());
} catch (JobExecutionAlreadyRunningException | JobRestartException | JobInstanceAlreadyCompleteException
| JobParametersInvalidException e) {
log.error(e.getMessage(), e);
}
}
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)