планировать одноразовое задание программно - PullRequest
0 голосов
/ 19 сентября 2018

Как правильно планировать одноразовое задание (запускаемое) программно с заданным временем в Springboot?Я не могу найти эту информацию нигде.IIUC Я хотел бы позвонить

org.springframework.scheduling.TaskScheduler#scheduleWithFixedDelay(java.lang.Runnable, java.util.Date, long)

, но TaskScheduler не может быть введен (с автоматической настройкой).То же самое для ScheduledTaskRegistrar.Я могу начать свой собственный кварц, но это не правильно.Я хочу сделать это правильно и повторно использовать то, что уже реализовано в Springboot.Опять же, мне нужно сделать это программно, т.е.вызовите this , через одну минуту, поэтому аннотаций нет.Даже если я реализую SchedulingConfigurer, ScheduledTaskRegistrar, переданный в configureTask, не установит TaskScheduler.

Это кажется совершенно недокументированным, хотя это должно быть действительно легко сделать.Может кто-нибудь посоветовать?

РЕДАКТИРОВАТЬ: извините, я не прочитал документацию, желаемый метод - org.springframework.scheduling.TaskScheduler#schedule(java.lang.Runnable, java.util.Date), так как один из упомянутых выше вызывает задание несколько раз, хотя требуется только один раз.Но суть в том, чтобы в первую очередь связаться с TaskScheduler, так что остальное остается в силе.Примечание: ручная настройка ThreadPoolTaskScheduler работает, но разве не должна быть настроена Springboot, если присутствует @EnableScheduling?

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

ОК, поэтому я не смог выяснить, как повторно использовать существующий TaskScheduler / threadpool, поэтому лучшее, что я смог придумать, это следующая конфигурация, которая создает новый компонент TaskScheduler и регистрирует его как новый TaskScheduler по умолчанию,Используя эту конфигурацию, можно автоматически подключать / вставлять TaskScheduler и вызывать для него методы, а методы @Scheduled будут использовать тот же ThreadPool.

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;

@Configuration
@EnableScheduling
public class SchedulingConfig implements SchedulingConfigurer {

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setTaskScheduler(threadPoolTaskScheduler());
    }

    @Bean
    public ThreadPoolTaskScheduler threadPoolTaskScheduler(){
        ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
        threadPoolTaskScheduler.setPoolSize(1);
        threadPoolTaskScheduler.initialize();
//        threadPoolTaskScheduler.setThreadNamePrefix("ThreadPoolTaskScheduler");
        return threadPoolTaskScheduler;
    }
}
0 голосов
/ 19 сентября 2018

Вот как мы можем включить планирование задач в Spring.

  1. Создать класс конфигурации с аннотацией @ EnableScheduling
@Configuration
@EnableScheduling
public class ApplicationConfiguration {
}

@EnableScheduling - это аннотация модуля Spring Context, которая автоматически регистрирует компонент ScheduledAnnotationBeanPostProcessor .Он будет проверять бобы Spring на наличие аннотации @Scheduled.

Создайте класс задачи с методом, помеченным @ Scheduled
@Component
public class MyTask {

  private static final Logger LOGGER = LoggerFactory.getLogger(MyTask.class);

  @Scheduled(cron="*/5 * * * * ?")
  public void scheduledTask() {
    LOGGER.info("Execute task " + LocalDateTime.now());
  }

}

Обратите внимание, что метод не должен иметь аргументов и должен иметь тип возвращаемого значения void.

И основной класс приложения
@SpringBootApplication
public class SpringSchedulingExample {

  public static void main(String[] args) {
    SpringApplication.run(SpringSchedulingExample.class, args);
  }

}

Запустите приложение, и вы будете ежедневно регистрировать сообщение каждые пять секунд, как определено в выражении cron :

2018-09-19 15:09:15.000  INFO 15191 --- [pool-1-thread-1] com.example.demo.MyTask : Execute task 2018-09-19T15:09:15
2018-09-19 15:09:20.000  INFO 15191 --- [pool-1-thread-1] com.example.demo.MyTask : Execute task 2018-09-19T15:09:20
2018-09-19 15:09:25.000  INFO 15191 --- [pool-1-thread-1] com.example.demo.MyTask : Execute task 2018-09-19T15:09:25
2018-09-19 15:09:30.000  INFO 15191 --- [pool-1-thread-1] com.example.demo.MyTask : Execute task 2018-09-19T15:09:30
...

Или, например, запланировать задание на 19 сентября в 15: 25: 00:

@Scheduled(cron="0 25 15 19 9 *")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...