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 private
el 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.