栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Java

基于Spring Task的Spring定时任务

Java 更新时间:发布时间: 百科书网 趣学号
基于Spring Task的Spring定时任务 1 使用@Scheduled注解

举例:

@Configuration
@EnableScheduling
public class SpringScheduleTask {

    
    @Scheduled(cron = "*/5 * * * * ?")
    private void configureTasks1() {
        System.err.println("定时任务1......");
    }

    
    @Scheduled(fixedRate = 1)
    private void configureTasks2() {
        System.out.println("定时任务2......");
    }
}

注意:fixedRate和cron不可以同时使用

1.1 cron方式

字段含义:

  • *:代表全部可能的值

  • -:指定范围例如1-4

  • ,:表示或 例如在分钟里,"5,15"表示5分钟和20分钟触发

  • W:只能用在月份中,表示最接近指定天的工作日

  • #:用在星期中表示这个月的第几个周几,例如5#3表示这个月的第3个周五

  • /:表示增量 例如在分钟里,"3/15"表示从3分钟开始,没隔15分钟执行一次

  • ?:表示没有具体的值

  • L:表示last,在星期中表示周日,月份中表示最后一天,6L表示这个月倒数第6天,FRIL表示这个月的最后一个星期五

示例:

*/5 * * * * ? 每隔5秒执行一次

0 */1 * * * ? 每隔1分钟执行一次

0 0 5-15 * * ? 每天5-15点整点触发

0 0/3 * * * ? 每三分钟触发一次

0 * * * * ? 每1分钟触发一次

0 0 * * * ? 每天每1小时触发一次

0 0 10 * * ? 每天10点触发一次

0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发

1.2 fixedRate方式

配合timeUnit参数,例如

@Scheduled(fixedRate = 1,timeUnit = TimeUnit.SECONDS)
private void configureTasks2() {
    System.out.println("定时任务2......");
}

TimeUnit的枚举类型主要有

  • DAYS :天
  • HOURS :小时
  • MINUTES :分钟
  • SEConDS :秒钟
  • MILLISEConDS :毫秒
  • MICROSEConDS :微秒
  • NANOSECONDS:纳秒
1.3 @Scheduled注解源码
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@documented
@Repeatable(Schedules.class)
public @interface Scheduled {

   String CRON_DISABLED = ScheduledTaskRegistrar.CRON_DISABLED;

   String cron() default "";  //配置cron参数

   String zone() default "";  //配置时区

   long fixedDelay() default -1;

   String fixedDelayString() default "";

   long fixedRate() default -1;

   String fixedRateString() default "";

   long initialDelay() default -1;

   String initialDelayString() default ""; //

   TimeUnit timeUnit() default TimeUnit.MILLISECONDS; //配置时间单位,默认毫秒
}
2 实现SchedulingConfigurer接口 2.1 代码实现
@Configuration
@EnableScheduling
public class SpringScheduleTaskImpl implements SchedulingConfigurer {

    
    @SuppressWarnings("all")
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.addTriggerTask(() -> {
                    System.out.println("定时任务3......");
                },
                triggerContext -> {
                    return new CronTrigger("0/1 * * * * ?").nextExecutionTime(triggerContext);
                });

        taskRegistrar.addFixedRateTask(() -> {
                    System.out.println("定时任务4......");
                },
                1000
        );

        taskRegistrar.addCronTask(() -> {
                    System.out.println("定时任务5......");
                },
                "0/1 * * * * ?"
        );
    }
}
2.2 配置文件方式

配置文件:

server.port=0
task.cron=0/2 * * * * ?

代码:

@Configuration
@EnableScheduling
public class SpringScheduleTaskImplByFile implements SchedulingConfigurer {


    @Value("${task.cron}")
    private String cron;

    
    @SuppressWarnings("all")
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.addTriggerTask(() -> {
                    System.out.println("定时任务7......");
                },
                triggerContext -> {
                    return new CronTrigger(cron).nextExecutionTime(triggerContext);
                });
    }
}
2.3 数据库方式
@Configuration
@EnableScheduling
public class SpringScheduleTaskImplByDB implements SchedulingConfigurer {

    @TableName("tb_task")
    @Data
    class MyTask {
        @TableId(type = IdType.AUTO,value = "id")
        private Integer id;
        @TableField(value = "cron")
        private String cron;
    }

    @Mapper
    interface TaskMapper extends baseMapper {
    }

    @Autowired
    private TaskMapper taskMapper;
    
    
    @SuppressWarnings("all")
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.addTriggerTask(() -> {
                    System.out.println("定时任务10......");
                },
                triggerContext -> {
                    MyTask myTask = taskMapper.selectById(1);
                    return new CronTrigger(myTask.getCron()).nextExecutionTime(triggerContext);
                });
    }
    
}
...");
                },
                triggerContext -> {
                    MyTask myTask = taskMapper.selectById(1);
                    return new CronTrigger(myTask.getCron()).nextExecutionTime(triggerContext);
                });
    }
    
}
3 对比

基于注解形式的一般都是静态的定时任务,就是注解中的内容是固定的并且只有一个定时任务,而实现接口的可以是动态的,可以根据配置文件和数据库进行切换。

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/275057.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号