首页 > 编程知识 正文

scheduled定时器配置,spring定时任务原理

时间:2023-05-05 20:59:03 阅读:160452 作者:645

方法一、可以使用注释@Component@EnableScheduling//对启动类进行注释,也可以使用当前文件publicclasstestjob { @ scheduled (cron=' ) ) publicvoidrunfirst ((system.out.print ln ) (******firstjobisok******* ' ); }@scheduled(fixedrate=1000*10 ) public void runsecend ) system.out.println (* * * * second jobisok * * ) @scheduled(fixeddelay=1000 ) public void runThird ) ) system.out.print ln (* * * * * * third jobisok * * * * } } @Scheduled为了标记这个方法而使用的是定时任务的方法cron、fixedRate、fixedDelay这3个是为了调度时间,这3个方法都被设定为每10秒运行一次

固定速率:指示scheduled每隔多长时间调用一次。 fixed delay:fixed delay,无论任务是否已执行,cron以表达式形式表示时间,表示任务运行后每隔多长时间调用一次。 从其他博客中摘录了几个例子,看了之后觉得几乎没有问题。

公式的意思:

“0 0 12 * *? 每天中午12点触发“0 15 10? *”每天上午10:15点“0 15 10 * *? 每天上午10:15触发“0 15 10 * *? *”每天上午10:15点“0 15 10 * *? 2005 ) 2005年每日上午10:15:00 * 14 * *? 每天下午2点至下午2:59点之间的每一分钟“0 0/5 14 * *? 每天下午2点至下午2:55之间的每5分钟“00/514,18 * *? 每天下午2点到2:55之间和下午6点到6:55之间的每5分钟“0 0-5 14 * *? 每天下午2点到下午2:05之间的每一分钟“010,4414? 3 WED”在每年3月的星期三下午2:10和2:44是“0 15 10? * MON-FRI”周一至周五上午10:15时,“0 15 10 15 *? 每月15日上午10:15时“0 15 10 L *? 每月最后一天上午10:15触发“0 15 10? * 6L”每月最后一个星期五上午10:15“0 15 10? * 6L 2005-2005”2002-2005年每月最后一个星期五上午10:15“0 15 10? *6#”每月第三周五上午10:15触发0 6 * * *每天早上6:00/2 * *每小时023-7/2,8 * * *晚上11:00至早上8:00之间每2:00至114*1- 3月4日及每周一至周三

方式二:接口scheduling configurer:@ configuration @ components can (value=' com.es.evaluation _ teaching _ WP.utilill mentsschedulingconfigurer { @ overridepublicvoidconfiguretasks ({ task registrar.addfixedratetask (new runable () ) ) ) { @ ovelided ); (,100 ); task registrar.addtriggertask (new runnable () ) { @Override public void run ) { System。

out.println("addTriggerTask new Runnable() 定时任务执行了。"); } }, new Trigger() { @Override public Date nextExecutionTime(TriggerContext triggerContext) { // 定时任务触发,可修改定时任务的执行周期 CronTrigger trigger = new CronTrigger("*/2 * * * * ?"); Date nextExecDate = trigger.nextExecutionTime(triggerContext); return nextExecDate; } }); //或者使用JDK 1.8的Lambda表达式 taskRegistrar.addFixedRateTask(() -> System.out.println("Lambda表达式,执行定时任务1: " + new Date()), 1000); TriggerTask triggrtTask = new TriggerTask( // 任务内容.拉姆达表达式 () -> {System.out.println("Lambda表达式,执行定时任务2: " + new Date());}, // 设置触发器,这里是一个拉姆达表达式,传入的TriggerContext类型,返回的是Date类型 triggerContext -> { // 2.3 返回执行周期(Date) return new CronTrigger("*/2 * * * * ?").nextExecutionTime(triggerContext); }); taskRegistrar.addTriggerTask(triggrtTask); }}  

多线程配置:

默认的,SchedulingConfigurer 使用的也是单线程的方式,如果需要配置多线程,则需要指定 PoolSize,加入如下代码即可:

@Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar) {ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();taskScheduler.setPoolSize(10);taskScheduler.initialize();taskRegistrar.setTaskScheduler(taskScheduler);}

动态修改定时规则:

可以定义一个 cron变量,提供set方法,由外部根据不同条件而修改cron表达式的值;

/** * @description:动态修改定时任务cron参数 */@Component@EnableSchedulingpublic class TestTask implements SchedulingConfigurer { private static String cron = "0 0/1 * * * ?"; public void setCron(String cron) { this.cron = cron; } @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.addTriggerTask(new Runnable() { @Override public void run() { // 定时任务的业务逻辑 System.out.println("1动态修改定时任务cron参数。" ) } }, new Trigger() { @Override public Date nextExecutionTime(TriggerContext triggerContext) { // 定时任务触发,可修改定时任务的执行周期 CronTrigger trigger = new CronTrigger(cron); Date nextExecDate = trigger.nextExecutionTime(triggerContext); return nextExecDate; } }); }}

 

2.另一种是

https://blog.csdn.net/jianggujin/article/details/77937316

此方法基于 SchedulingConfigurer 的源码,捕获 ScheduledTaskRegistrar 类的实例,通过该类中的 TaskScheduler 实例操作定时任务的增删,而非采用 ScheduledTaskRegistrar.addTriggerTask 方法维护定时任务。所以需要自行写代码维护定时任务列表,控制任务的删减,代码的实现比较繁琐。

如果想要实现可以动态修改的定时策略,建议使用开源组件 Quartz。

最后感谢同学们的阅读,愿大家一起学习,一起成长。请大家关注公众号,后续将持续发布更多有用的知识,谢谢大家!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。