以编程方式安排一次任务

时间:2018-09-19 10:52:01

标签: java spring-boot scheduled-tasks

从现在开始在Springboot中以编程方式在给定的时间安排单发任务(可运行)的正确方法是什么?我在任何地方都找不到该信息。我想打电话给

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

但不能注入TaskScheduler(自动配置)。与ScheduledTaskRegistrar相同。我可以启动自己的石英,但这是不对的。我想正确地做,并重用springboot中已经实现的功能。同样,我需要以编程方式进行操作,即。从现在开始一分钟调用 this ,因此没有注释。即使我实现了SchedulingConfigurer,传递给configureTask的ScheduledTaskRegistrar也没有设置TaskScheduler

这似乎是完全没有记载的,而这确实应该很容易做到。有人可以建议吗?

编辑:抱歉,我没有正确阅读文档,所需的方法是org.springframework.scheduling.TaskScheduler#schedule(java.lang.Runnable, java.util.Date),因为上述方法多次调用作业,而只需要一次。但是症结所在首先是与TaskScheduler保持联系,因此其余部分都成立了。注意:手动配置ThreadPoolTaskScheduler是可行的,但是如果存在@EnableScheduling的话,springboot是否应该已经配置了一个?

2 个答案:

答案 0 :(得分:0)

这是我们在Spring中启用任务调度的方法。

  1. 创建一个带有@EnableScheduling注释的配置类
@Configuration
@EnableScheduling
public class ApplicationConfiguration {
}

@EnableScheduling是一个Spring Context模块注释,它将自动注册一个ScheduledAnnotationBeanPostProcessor bean。它将扫描Spring bean是否存在@Scheduled批注。

  1. 使用带有@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());
  }

}

请注意,该方法必须没有参数,并且返回类型必须为空。

  1. 主要应用程序类
@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
...

例如,要在9月19日15:25:00安排任务:

@Scheduled(cron="0 25 15 19 9 *")

答案 1 :(得分:0)

好,所以我没有找到如何重用现有TaskScheduler / threadpool的方法,所以我能想到的最好的方法是遵循配置,该配置创建新的TaskScheduler bean,并将其注册为新的bean。默认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;
    }
}