Spring 编程式定时任务

x33g5p2x  于2022-02-17 转载在 Spring  
字(0.9k)|赞(0)|评价(0)|浏览(306)

(其实不单单事务有编程式和声明式,定时任务也有哦…)

Spring 声明式定时任务大家都用的很频繁并且很熟练了吧,通过@EnableScheduling@Schedule(cron)注解即可实现。

虽然声明式定时任务配合上强大的cron表达式已经可以满足我们的大多数需求了,但是如果说在程序运行期间我们需要更改定时任务的执行频率,通过编程式@Schedule注解是不容易去实现的。

为此Spring为我们提供了一个接口SchedulingConfigurer可以让定时任务在运行时更改执行频率,我们只需要一个实现了该接口的类,通过重写configureTasks(ScheduledTaskRegistrar taskRegistrar)方法来实现定时任务运行频率的修改:

@EnableScheduling
public class MySchedule implements SchedulingConfigurer {

    private static String expression = "0 0/10 * * * ?";

    public static void setExpression(String expression) {
        MySchedule.expression = expression;
    }

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.addTriggerTask(
                new Runnable() {
                    @Override
                    public void run() {
                        // 具体的定时任务
                    }
                },
                new Trigger() {
                    @Override
                    public Date nextExecutionTime(TriggerContext triggerContext) {
                        return new CronTrigger(expression).nextExecutionTime(triggerContext);
                    }
                }
        );
    }
}

如此便可以修改定时任务的执行频率,只需将该类的静态变量expression重新赋值即可:

MySchedule.setExpression("0 0/20 * * * ?" /* 新的cron表达式 */);

相关文章