Как запланировать метод при вызове

#java #spring-boot #scheduler

#java #весенняя загрузка #планировщик

Вопрос:

Как настроить метод, который будет запланирован вызывающим методом. Что я именно имею в виду. Добавление аннотации @Scheduled , метод вызывается из приложения start.

Я хочу запускать этот метод с schedule (например, каждые 2 минуты), но только если программа вызывает этот метод, иначе этот метод не должен быть запланирован.

Может быть, есть другой способ сделать это? Еще одна аннотация? Если нет, то как это настроить?

Комментарии:

1. Затем вы можете использовать планировщик для вызывающего метода.

2. @PawanTiwari можете ли вы привести пример?

3. Решение не настолько длинное, чтобы оно было ответом, однако вы можете использовать аннотацию @schedule для вашего вызывающего метода, на который вы хотите получить ответ от вызывающего метода.

Ответ №1:

Используйте одну из реализаций 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 , но вы можете записать его как лямбда-выражение.