如何在不使用 @Scheduled() 注释的情况下在 Spring Boot 中安排 cron 作业

Ara*_*289 5 cron spring job-scheduling spring-scheduled spring-boot

在 spring boot 中,我可以通过不使用@Scheduled方法的注释来安排 spring 作业吗?

我正在春季靴中从事春季工作。我想通过使用 cron 表达式来安排作业,但不使用@Scheduled(cron = " ")该方法的注释。

我知道我可以在这个方法中安排一个工作,如下所示。

@Scheduled (cron = "0 10 10 10 * ?")

public void execute() { 

   / * some job code * /

}
Run Code Online (Sandbox Code Playgroud)

但我希望它是动态的,以便我可以将 cron 表达式作为用户的输入并安排它。

Chr*_*yer 7

自从我发现你的问题很有趣并且之前对这个问题感兴趣以来,我想出了一个可行的例子。它完全基于源代码,因此我不知道它是否接近遵循最佳实践。尽管如此,您也许可以根据您的需要进行调整。仅供参考,您不一定需要创建一个新的 ScheduledTaskRegistrar 对象 - 我认为由于您的目标是动态调度程序,因此您不会对纯粹在覆盖方法中定义任务感兴趣。

@SpringBootApplication
public class TaskScheduler implements SchedulingConfigurer, CommandLineRunner {

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

    List<CronTask> cronTasks;

    @Override
    public void run(String... args) throws Exception {
        CronTask task = this.createCronTask(new Runnable() {
            @Override
            public void run() {
                System.out.println(LocalDateTime.now());
            }
        }, "1/10 * * * * *");

        ScheduledTaskRegistrar taskRegistrar = new ScheduledTaskRegistrar();
        taskRegistrar.addCronTask(task);
        configureTasks(taskRegistrar);
        Thread.sleep(51);

        taskRegistrar.destroy();
        taskRegistrar = null;

        ScheduledTaskRegistrar taskRegistrar2 = new ScheduledTaskRegistrar();
        taskRegistrar2.addCronTask(task);
        configureTasks(taskRegistrar2);

    }

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        // "Calls scheduleTasks() at bean construction time" - docs
        taskRegistrar.afterPropertiesSet();
    }

    public CronTask createCronTask(Runnable action, String expression) {
        return new CronTask(action, new CronTrigger(expression));
    }

}
Run Code Online (Sandbox Code Playgroud)

我有在 Azure 和其他地方使用 cron 作业的经验。@Scheduled在 Java 编程中,为了简单起见,我通常使用固定时间。希望这对你有用。