Como integrar spring batch+spring boot+quartz

27/01/2017

9

Bom dia.

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?
Responder

Post mais votado

27/01/2017

Olá 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 !
Responder

Mais Posts

27/01/2017

Leandro Silva

Obrigado por ter respondido!

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

27/01/2017

Leandro Silva

Olá 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);

		}

	}

Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira