Spring ScheduledTask – start / stop supporto?

C’è un modo per avviare o interrompere un’attività pianificata utilizzando le Operazioni pianificate di spring inizializzate utilizzando il file di contesto o l’annotazione @Scheduled?

Vorrei avviare l’attività quando richiesto e interromperla quando l’attività non è più necessaria per essere eseguita.

Se questo non è ansible, qualche alternativa all’iniettare le variabili primaverili in una discussione?

L’arresto dei bean registrati @ non è una caratteristica standard poiché l’accesso ad essi è privato nel file org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor .

Se è necessario gestire il tempo di esecuzione, è necessario registrarli a org.springframework.scheduling.annotation.SchedulingConfigurer di org.springframework.scheduling.annotation.SchedulingConfigurer ( TriggerTask ): consultare la documentazione su org.springframework.scheduling.annotation.SchedulingConfigurer . Nel tipo org.springframework.scheduling.config.TriggerTask esiste il metodo che restituisce il tipo di org.springframework.scheduling.Trigger . Qui puoi gestire il prossimo tempo di esecuzione.

TriggerTask potrebbe essere bean nel caso di registrazione programmatica.

Ecco un esempio di avvio / arresto di un metodo programmato in Spring Boot. Puoi utilizzare tali API:
http: localhost: 8080 / start – per l’avvio di un metodo programmato con una velocità fissa di 5000 ms
http: localhost: 8080 / stop – per l’arresto del metodo programmato

 import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.scheduling.TaskScheduler; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import java.time.Instant; import java.util.concurrent.ScheduledFuture; @Configuration @ComponentScan @EnableAutoConfiguration public class TaskSchedulingApplication { public static void main(String[] args) { SpringApplication.run(TaskSchedulingApplication.class, args); } @Bean TaskScheduler threadPoolTaskScheduler() { return new ThreadPoolTaskScheduler(); } } @Controller class ScheduleController { public static final long FIXED_RATE = 5000; @Autowired TaskScheduler taskScheduler; ScheduledFuture scheduledFuture; @RequestMapping("start") ResponseEntity start() { scheduledFuture = taskScheduler.scheduleAtFixedRate(printHour(), FIXED_RATE); return new ResponseEntity(HttpStatus.OK); } @RequestMapping("stop") ResponseEntity stop() { scheduledFuture.cancel(false); return new ResponseEntity(HttpStatus.OK); } private Runnable printHour() { return () -> System.out.println("Hello " + Instant.now().toEpochMilli()); } } 

Chiedere al metodo @Scheduled cercare una variabile mantenuta nello stato Application o ServletContext o da un valore memorizzato nel DB. Se il valore è TRUE, procedere con l’attività; se FALSE, non iniziare. Questa configurazione controllerà l’esecuzione pianificata.

Se si desidera essere in grado di triggersre l’attività a proprio piacimento, fare riferimento al metodo dell’attività da un Controller; in questo modo puoi sparare a volontà. Inoltre, se è un’attività più lunga in esecuzione, creare un secondo metodo annotato @Async e chiamare tale metodo dal controller in modo che venga eseguito nella propria thread.