Используйте одну из реализаций Spring TaskScheduler .
//Somewhere define the desired scheduler.
@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler(){
ThreadPoolTaskScheduler threadPoolTaskScheduler
= new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(5);
threadPoolTaskScheduler.setThreadNamePrefix(
"ThreadPoolTaskScheduler");
return threadPoolTaskScheduler;
}
// define the task you want to run
class RunnableTask implements Runnable{
private String message;
public RunnableTask(String message){
this.message = message;
}
@Override
public void run() {
System.out.println(new Date()+" Runnable Task with "+message
+" on thread "+Thread.currentThread().getName());
}
}
// to schedule:
taskScheduler.scheduleAtFixedRate(new RunnableTask("Fixed Rate of 2 seconds") , 2000);
Кредиты для Baeldung
Основная идея - иметь какой-то планировщикопределенный в ApplicationContext (т.е. в форме бина).Затем в вашей логике (где вы хотите отправить повторяющуюся задачу) вы автоматически связываете этого исполнителя и отправляете задачу.
В качестве альтернативы, если выражение, которое вы хотите запустить, не имеет состояния, вам необязательно иметь класс, реализующийRunnable
, но вы можете написать его как лямбда-выражение.