Spring实现定时任务,@Scheduled注解

场景:项目需要将平台的性能数据指标上传至监控平台,15分钟上传一次

使用方法:

1.在需要定时任务的类上加上@Component作用就是把普通的pojo实例化到spring的容器中,相当于配置文件中的 <bean  id = ""  class =""/>

2.加上@EnableScheduling注解,在配置类上使用,作用就是开启计划任务的支持

注意:注解@Scheduled一般作用于无参没有返回类型(void)的方法上

 

定时类

@Component("task")
@EnableScheduling
public class Task {

    private static final Logger LOG = LoggerFactory.getLogger(Task.class);

    @Autowired
    private DataHandleService dataHandleService;

    /**
     * 15分钟上报一次性能指标数据
     */
    @Scheduled(cron = "0 */15 * * * ?")
    private void monitorPerformanceExistUser() {
        LOG.info("task start execution");
     //这里写逻辑代码 dataHandleService.monitorPerformanceExistUser(); LOG.info(
"end of task execution"); } }

 

@Scheduled(cron = "0 0 1 * * ?")

依次为:秒、分、时、日、月、周、年(非必填)

字符解释:

* :通配,语义相当于每… 比如第五个位置的 *就表示每月都会执行(相当于1-12)

? :忽略,语义相当于不管… 比如第六个位置的?就表示不管当前是周几就会执行。至于为什么会有这种用法,我觉得应该是因为它和其他的字符可能会冲突。如果用*的话表示周一到周日都会执行,此时其他语义就不明确了,所以如果用不上星期的话一般给它用一个?表示 not care。

/ :间隔,语义相当于每隔… 比如例2中的第三个位置的2/5就表示从2点开始每隔五小时

- :区间,语义相当于第…到…的每… 比如例2中的第二个位置的15-20就表示第15分钟到20分钟之间的每分钟

, :枚举,语义相当于第…和… 比如例2中的第一个位置的15,20,40就表示第15秒、20秒和40秒

L :最后(last),语义相当于最后一个 比如例2中的第四个位置的L就表示最后一天

W :工作日,字面意思,就是工作日 比如例3中的第四个位置的15W表示15号附近最近的工作日,如果15号刚好是工作日那就15号触发,如果15号是周六那就14号触发,如果15号是周日那就16号触发。前面不带数字就是所有匹配的工作日。

# :周定位,语义相当于每月的第几个周几 比如例4中的第六个位置的2#3就表示第三个周一。

每隔5秒执行一次:*/5 * * * * ?
每隔1分钟执行一次:0 */1 * * * ?
每天凌晨1点执行一次:0 0 1 * * ?
每月1号凌晨1点执行一次:0 0 1 1 * ?
每月最后一天23点执行一次:0 0 23 L * ?
每周星期天凌晨1点实行一次:0 0 1 ? * L
每月的第三个周一:0 0 0 0 * 2#3 

 



 

posted @ 2022-08-18 11:44  企业级理解  阅读(478)  评论(0编辑  收藏  举报