Como integrar spring batch+spring boot+quartz
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
Post 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
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); } } }; }
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); } }
Clique aqui para fazer login e interagir na Comunidade :)