SpringBoot使用SpringTask实现定时任务

作者: deepwinter 分类: 后端 发布时间: 2018-01-16 10:22 点击量: 905 次阅读

原创文章,转载请注明出处,谢谢。


1. 对比Quartz的优缺点

优点:
* 配置非常简单

缺点:
* 不支持分布式部署
* 不支持动态配置定时任务
* 不支持持久化

其实这几个缺点归根结底都是因为不支持持久化,所以如果项目需要持久化定时任务,还是要选择Quartz比较好。


2. SpringBoot整合及使用

在我们的项目开发过程中,经常需要定时任务来帮助我们来做一些内容,springboot默认已经帮我们实行了,只需要添加相应的注解就可以实现

2.1. pom配置

pom文件里面并不需要引入什么依赖,Spring默认提供。

2.2. 启动类启用定时

在启动类上面加上@EnableScheduling即可开启定时

@Configuration
@EnableScheduling
public class SchedulerConfig {
}

2.3. 创建定时任务实现类

定时任务1:

@Component
public class TestTask1 {
    private int count=0;

    @Scheduled(cron="*/6 * * * * ?")
    private void process(){
        System.out.println("[" + Thread.currentThread().getName() + "]" + "this is scheduler task runing  "+(count++));
    }
}

定时任务2:

@Component
public class TestTask2 {
    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

    @Scheduled(fixedRate = 6000)
    public void reportCurrentTime() {
        System.out.println("[" + Thread.currentThread().getName() + "]" + "现在时间:" + dateFormat.format(new Date()));
    }
}

结果如下:

[pool-4-thread-1]this is scheduler task runing  0
[pool-4-thread-1]现在时间:17:07:10
[pool-4-thread-1]this is scheduler task runing  1
[pool-4-thread-1]现在时间:17:07:16
[pool-4-thread-1]this is scheduler task runing  2
[pool-4-thread-1]现在时间:17:07:22
[pool-4-thread-1]this is scheduler task runing  3
[pool-4-thread-1]现在时间:17:07:28

2.3. 参数说明

@Scheduled所支持的参数:

  1. cron:cron表达式,指定任务在特定时间执行;
  2. fixedDelay:表示上一次任务执行完成后多久再次执行,参数类型为long,单位ms;
  3. fixedDelayString:与fixedDelay含义一样,只是参数类型变为String;
  4. fixedRate:表示按一定的频率执行任务,参数类型为long,单位ms;
  5. fixedRateString: 与fixedRate的含义一样,只是将参数类型变为String;
  6. initialDelay:表示延迟多久再第一次执行任务,参数类型为long,单位ms;
  7. initialDelayString:与initialDelay的含义一样,只是将参数类型变为String;
  8. zone:时区,默认为当前时区,一般没有用到。

3. 设置多线程

从上图的输出结果可以看到,两个定时任务使用的是同一个线程,这是因为SpringTask默认是多线程的。
在实际开发过程中,我们当然不希望所有的任务都运行在一个线程中。
想要改成多线程,给SpringTask提供一个多线程的TaskScheduler即可,Spring已经有默认实现。

@Configuration
@EnableScheduling
public class SchedulerConfig {
    @Bean
    public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        //线程池大小
        scheduler.setPoolSize(10);
        //线程名字前缀
        scheduler.setThreadNamePrefix("spring-task-thread");
        return scheduler;
    }
}

改造后的输出结果:

[spring-task-thread1]this is scheduler task runing  0
[spring-task-thread2]现在时间:17:15:50
[spring-task-thread3]this is scheduler task runing  1
[spring-task-thread1]现在时间:17:15:56
[spring-task-thread4]this is scheduler task runing  2
[spring-task-thread2]现在时间:17:16:02
[spring-task-thread5]this is scheduler task runing  3
[spring-task-thread3]现在时间:17:16:08

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注