2011-08-18 19 views
7

¿Hay alguna manera de iniciar o detener una tarea programada utilizando Spring Scheduled Tasks inicializadas mediante el archivo de contexto o @Scheduled Annotation?Spring ScheduledTask - Start/Stop Support?

Me gustaría iniciar la tarea cuando sea necesario y detenerla cuando ya no sea necesaria la ejecución de la tarea.

Si esto no es posible, ¿alguna alternativa a la inyección de variables de resorte en una rosca?

Respuesta

1

Haga que el método @Scheduled busque una variable contenida en el estado Application o ServletContext, o desde un valor almacenado en la base de datos. Si el valor es VERDADERO, proceda con la tarea; si es FALSO, no empieces. Esta configuración controlará la ejecución programada.

Si desea también poder iniciar la tarea a voluntad, haga referencia al método de la tarea desde un Controlador; de esa manera puedes disparar a voluntad. Además, si es una tarea más larga, cree un segundo método anotado @Async y llame a ese método desde su Controlador para que se ejecute en su propio hilo.

+0

Cuando dice "no iniciar", esto no se puede hacer, Spring ejecutará la función cada X segundos. No hay un mecanismo de "inicio". – mbdev

+0

Quise decir salir del método, o hacer otra cosa para que la función de negocio del método no se ejecute. – atrain

+0

Bueno, creo que el método mantendrá la función aunque salga. Espero que haya una mejor solución. – mbdev

0

Aquí hay un ejemplo de iniciar/detener un método programado en Spring Boot. Puede utilizar estas API:
http: localhost: 8080/Start - para comenzar método programado con tasa fija 5000 ms
http: localhost: 8080/STOP - para detener método programado

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<Void> start() { 
     scheduledFuture = taskScheduler.scheduleAtFixedRate(printHour(), FIXED_RATE); 

     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("Hello " + Instant.now().toEpochMilli()); 
    } 

} 
2

La detención de los beans @Scheduled registrados no es una función estándar, ya que el acceso a ellos es privado en el org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor.

Si necesita administrar el tiempo que corren, debe registrarlos programáticamente (TriggerTask): consulte la documentación en org.springframework.scheduling.annotation.SchedulingConfigurer. En el tipo org.springframework.scheduling.config.TriggerTask existe el método que devuelve el tipo de org.springframework.scheduling.Trigger. Allí puede administrar el próximo tiempo de ejecución.

TriggerTask s pueden ser frijoles en el caso de registro programático.

+0

¡Guau! ¡Salvó mi día! – Bsalex