Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

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!