Solucionado (ver solução)
Solucionado
(ver solução)
15
respostas

Schedule dinâmica Spring Boot

Boa tarde!

Gostaria de configurar uma Schedule dinâmica dentro do Spring Boot:

Dinâmico me refiro a alteração do tempo do cron por exemplo.

EX: Configurei uma Schedule para executar a cada 5 minutos, depois de um tempo gostaria de desabilita-la ou alterar o tempo para a cada 10 minutos por exemplo.

Tem como?

Desde já muito obrigado!

15 respostas

Fala ai Patrick, de boa ?

Cara você poderia ter algum bean no seu sistema que seja de escopo da aplicação.

E você o injeta no cron para pegar essa configuração.

Ai você precisaria ter algo no seu sistema que alterasse o valor desse seu bean.

O que acha?

Acho bacana... Você teria algum exemplo para eu implementar algo do tipo?

Nunca precisei fazer isso, mas basicamente seria criar as classes e usar a anotação @Component e para fazer a injeção @Autowired

Esta injeção do @Autowired seria em que objeto?

Cara você poderia ter algum bean no seu sistema que seja de escopo da aplicação -- Aqui seria uma classe anotada com @Component.

E você o injeta, o bean que você criou ainda pouco, no cron, que vai ser um @Component, para pegar essa configuração.

Ai você precisaria ter algo no seu sistema que alterasse o valor desse seu bean, um tela talvez.

@Component
@EnableScheduling
public class ScheduleTeste{

  private final long SEGUNDO = 1000;
  private final long MINUTO = SEGUNDO * 60;
  private final long HORA = MINUTO * 60;

  @Scheduled(cron = "0 0 12 * * *")
  public void testeSchedule() {
    System.out.println(LocalDateTime.now());
  }
}

Este é o código, porém o cron está definido com anotação >> @Scheduled(cron = "0 0 12 *") << neste sentido que gostaria de saber, como alterar o valor em tempo de execução...

Entendeu?

Acho que rola fazer algo assim

@Component
@EnableScheduling
public class ScheduleTeste{

  @Autowired
private Objeto objeto;

  @Scheduled(cron = objeto.getValorDoCron())
  public void testeSchedule() {
    System.out.println(LocalDateTime.now());
  }
}

Bacana... Você sabe como em tempo de execução eu desabilito esta Schedule, por exemplo?

Tentei implementar o que você sugeriu...

Segue o problema: The value for annotation attribute Scheduled.cron must be a constant expression

Puts :( Já não sei mais o que fazer

Boa noite, Patrick! Como vai?

Acho que o melhor é vc usar o TimerService que é um timer programático em vez de utilizar um timer automático como está tentando!

Com o timer programático vc pode agendar com uma periodicidade prévia e quando quiser mudar é só cancelar e criar outro.

Dá uma olhada nesse link, especialmente no item 4.

Qualquer coisa é só falar!

Grande abraço!

E aí, Patrick! Conseguiu resolver o problema?

Se sim, vc poderia compartilhar com a gente a solução?

Hoje eu não tive tempo para realizar os testes... Porém amanhã já vou aplicar sua sugestão é já informo vocês...

Desde já agradeço e se tiverem mais sugestões estou aberto a outras.

Li a documentação... Porém o TimerService é do EJB... EU gostaria de utilizar algo dentro do Spring.,,

Alguém sabe, poderia me ajudar?

solução!

Boa tarde galera, tudo bem com vocês? Consegui o que eu estava procurando, segue exemplo abaixo:

package br.com.totvs.poc.schedule.exemplos;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ScheduledFuture;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/testeScheduleCron")
public class ExemploTaskScheduleWithCron {

    public String cron  = "0 */1 * * * *";

    @Autowired
    private TaskScheduler task;

    private ScheduledFuture<?> scheduledFuture;

    @RequestMapping("start")
    ResponseEntity<Void> start() {
        scheduledFuture = task.schedule(printHour(), new CronTrigger(cron));

        return new ResponseEntity<Void>(HttpStatus.OK);
    }

    @RequestMapping("stop")
    ResponseEntity<Void> stop() {
        scheduledFuture.cancel(false);
        return new ResponseEntity<Void>(HttpStatus.OK);
    }

    private Runnable printHour() {
        return () -> System.out.println(new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new Date()));
    }
}

Boa tarde, Patrick!

Mto bacana! Valeu por compartilhar aqui no fórum a solução!

Grande abraço!