springboot整合springtask

在使用 springmvc 中,一般的定时任务是使用 job 或者 quartz 或者timer来实现,但是使用它们的时候比较麻烦,会在 xml 文件中配置很多,

springboot 的定时任务比较简单。

1、在 application 启动类中使用 @EnableScheduling 注解开启定时任务,会自动扫描,相当于一个开关,把这个开关开完之后,那么只要在相应的任务类中做相应的任务,那么就会被 spring boot 容器扫描到,扫描到后,根据任务定义的时间

会自动运行

@SpringBootApplication
@EnableScheduling
public class SpringbootredisApplication {

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

}

2 配置组件

package com.cxy.config;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
public class TaskTest {
    @Scheduled(cron = "*/1 * * * * ?")
    public  void po(){
        System.out.println(System.currentTimeMillis());
    }
}

控制台输出

除了支持cron表达式之外还支持:

@Component
public class TaskTest {
//    @Scheduled(cron = "*/1 * * * * ?")
//    public  void po(){
//        System.out.println(System.currentTimeMillis());
//    }

    @Scheduled(fixedRate = 1000)
    public  void po(){
        System.out.println(System.currentTimeMillis());
    }
}

执行结果:

fixedRate: 上一次 启动时间点之后 X秒执行一次 

fixedDelay: 上一次 结束时间点之后 每X秒执行一次

initialDelay: 第一次延迟 X秒执行,之后按照fixedRate的规则每X秒执行 

 

但是springtask任务在分布式的时候会存在问题:部署多台服务之后,到底哪个服务器执行呢,那么就应该思考代码问题,不管不是timer,还是quatz等都是存在问题的,这种问题可以采用一下来执行:

 

1 可以选择代码分离进行单台部署,

2 可以选择redis分布式锁,让一台服务拿到相应的key之后去执行

3 使用zookeeper分布式锁获取单个锁,

 

如果别人问道这个问题,我们应该知道,清晰代码思路,确实我在之前项目是单台tomcat部署的,所有使用的是这个springtask作为定时任务,只是存在如果节点宕机之后就会出现

 

问题,所以可以去学习分布式任务进行整合,例如xxl-job

 

posted @ 2019-01-27 18:48  菩提树下的丁春秋  阅读(7894)  评论(1编辑  收藏  举报