Saltar al contenido

Cómo cambiar @Scheduled fixedDelay de Spring en tiempo de ejecución

Indagamos en el mundo online para así darte la respuesta para tu dilema, si tienes dudas puedes dejarnos tu pregunta y contestaremos con mucho gusto, porque estamos para ayudarte.

Solución:

¡En Spring Boot, puede usar una propiedad de la aplicación directamente!

Por ejemplo:

@Scheduled(fixedDelayString = "$my.property.fixed.delay.seconds000")
private void process() 
    // your impl here

Tenga en cuenta que también puede tener un valor predeterminado en caso de que la propiedad no esté definida, por ejemplo, para tener un valor predeterminado de “60” (segundos):

@Scheduled(fixedDelayString = "$my.property.fixed.delay.seconds:60000")

Otras cosas que descubrí:

  • el método debe ser void
  • el método no debe tener parámetros
  • el método puede ser private

Encontré ser capaz de usar private visibilidad útil y lo usé de esta manera:

@Service
public class MyService 
    public void process() 
        // do something
    

    @Scheduled(fixedDelayString = "$my.poll.fixed.delay.seconds000")
    private void autoProcess() 
        process();
    

Ser privateel método programado puede ser local para su servicio y no formar parte de la API de su Servicio.

Además, este enfoque permite que el process() método para devolver un valor, que un @Scheduled el método puede que no. por ejemplo, tu process() El método puede parecerse a:

public ProcessResult process() 
    // do something and collect information about what was done
    return processResult; 

para proporcionar alguna información sobre lo que sucedió durante el procesamiento.

Puedes usar un Trigger para establecer dinámicamente el próximo tiempo de ejecución. Mira mi respuesta aquí:

Programación de un trabajo con Spring programáticamente (con tasa fija establecida dinámicamente)

crear interfaz, algo así:

    public abstract class DynamicSchedule
        /**
         * Delays scheduler
         * @param milliseconds - the time to delay scheduler.
         */
        abstract void delay(Long milliseconds);

        /**
         * Decreases delay period
         * @param milliseconds - the time to decrease delay period.
         */
        abstract void decreaseDelayInterval(Long milliseconds);

        /**
         * Increases delay period
         * @param milliseconds - the time to increase dela period
        */
        abstract void increaseDelayInterval(Long milliseconds);

A continuación, implementemos la interfaz Trigger que se encuentra en org.springframework.scheduling en el proyecto spring-context.

import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.TriggerContext;

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

public class CustomDynamicSchedule extends DynamicSchedule implements Trigger 

    private TaskScheduler taskScheduler;
    private ScheduledFuture schedulerFuture;

    /**
     * milliseconds
     */
    private long delayInterval;

    public CustomDynamicSchedule(TaskScheduler taskScheduler) 
        this.taskScheduler = taskScheduler;
    


    @Override
    public void increaseDelayInterval(Long delay) 
        if (schedulerFuture != null) 
            schedulerFuture.cancel(true);
        
        this.delayInterval += delay;
        schedulerFuture = taskScheduler.schedule(() ->  , this);
    

    @Override
    public void decreaseDelayInterval(Long delay) 
        if (schedulerFuture != null) 
            schedulerFuture.cancel(true);
        
        this.delayInterval -= delay;
        schedulerFuture = taskScheduler.schedule(() ->  , this);
    

    @Override
    public void delay(Long delay) 
        if (schedulerFuture != null) 
            schedulerFuture.cancel(true);
        
        this.delayInterval = delay;
        schedulerFuture = taskScheduler.schedule(() ->  , this);
    

    @Override
    public Date nextExecutionTime(TriggerContext triggerContext) 
        Date lastTime = triggerContext.lastActualExecutionTime();
        return (lastTime == null) ? new Date() : new Date(lastTime.getTime() + delayInterval);
    

ahora configuración:

@Configuration
public class DynamicSchedulerConfig 
    @Bean
    public CustomDynamicSchedule getDynamicScheduler() 
        ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
        threadPoolTaskScheduler.initialize();
        return  new CustomDynamicSchedule(threadPoolTaskScheduler);
    

y uso:

@EnableScheduling
@Component
public class TestSchedulerComponent 

    @Autowired
    private CustomDynamicSchedule dynamicSchedule;

    @Scheduled(fixedDelay = 5000)
    public void testMethod() 
        dynamicSchedule.delay(1000l);
        dynamicSchedule.increaseDelayInterval(9000l);
        dynamicSchedule.decreaseDelayInterval(5000l);
    


Si haces scroll puedes encontrar las explicaciones de otros creadores, tú igualmente tienes la libertad de dejar el tuyo si te apetece.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *