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