Como integrar spring batch+spring boot+quartz

27/01/2017

0

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?
Leandro Silva

Leandro Silva

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 !

Angelo Santos

Angelo Santos
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

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar