springboot 定时器定时任务

本文介绍如何在Spring Boot项目中使用定时任务,通过具体代码示例展示了如何设置不同时间触发的任务。

项目中经常遇到一些需求就是需要你判断某个值是否到达要求的值或者某个条件下需要你执行某个动作,但你又不能一直判断,这时候我们需要使用定时器去设定某个时间去判断是否达到某个条件.
上干货,我使用的是spring中的定时器.我建立的是springboot项目.代码非
常简单.

以下是我的代码:

package com.example.demo.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
 * @author zjg
 * @day 18-2-5
 * @description
 */
@Slf4j
@Component //使spring管理
@EnableScheduling //定时任务注解
public class Timer {

    /**
     * 每天晚上21:50运行
     */
    @Scheduled(cron = "0 50 21 * * ?")
    public void initTimerOne(){
        log.info("我是在晚上21:50:00 定时器运行");
    }

    /**
     * 每天晚上21:50:30运行
     */
    @Scheduled(cron = "30 50 21 * * ?")
    public void initTimerTwo(){
        log.info("我是在晚上21:50:30 定时器运行");
    }

}

效果如下图

这里写图片描述

@Component 这个注解是为了让spring管理这个类

@EnableScheduling 这个注解是定时任务的注解,这个注解添加在定时的类上或者Application类上都可以,效果是一样的.

@Scheduled 这个注解加在方法上,注明这是一个定时方法.

@Scheduled里面的参数讲解一下
scheduled表达式规则如下:

一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素
从左往右依次代表
1.Seconds Minutes Hours DayofMonth Month DayofWeek Year
2.Seconds Minutes Hours DayofMonth Month DayofWeek

每个域中字符如下:
Seconds: 可出现”, - * /”四个字符,有效范围为0-59的整数
Minutes: 可出现”, - * /”四个字符,有效范围为0-59的整数
Hours: 可出现”, - * /”四个字符,有效范围为0-23的整数
DayofMonth :可出现”, - * / ? L W C”八个字符,有效范围为0-31的整数
Month: 可出现”, - * /”四个字符,有效范围为1-12的整数或JAN-DEc
DayofWeek: 可出现”, - * / ? L C #”四个字符,有效范围为1-7的整数或SUN-SAT两个范围。1表示星期天,2表示星期一, 依次类推
Year: 可出现”, - * /”四个字符,有效范围为1970-2099年

举些例子:

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

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

每天23点执行一次:”0 0 23 * * ?”

每天凌晨1点执行一次:”0 0 1 * * ?”

每月1号凌晨1点执行一次:”0 0 1 1 * ?”

每月最后一天23点执行一次:”0 0 23 L * ?”

每周星期天凌晨1点实行一次:”0 0 1 ? * L”

在26分、29分、33分执行一次:”0 26,29,33 * * * ?”

每天的0点、13点、18点、21点都执行一次:”0 0 0,13,18,21 * * ?”

表示在每月的1日的凌晨2点调度任务:”0 0 2 1 * ? *”

表示周一到周五每天上午10:15执行作业:”0 15 10 ? * MON-FRI”

表示2002-2006年的每个月的最后一个星期五上午10:15执行:”0 15 10 ? 6L 2002-2006”

### Spring Boot 定时任务配置与实现 #### 启用定时任务功能 为了使 `@Scheduled` 注解生效,在应用程序的主要类或任意配置类中添加 `@EnableScheduling` 注解是必要的[^2]。 ```java import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @EnableScheduling public class ScheduledTasksApplication { public static void main(String[] args) { SpringApplication.run(ScheduledTasksApplication.class, args); } } ``` #### 创建带有时辰调度的任务方法 定义一个带有 `@Scheduled` 注解的方法,该注解支持三种主要属性来控制执行频率: - **fixedRate**: 表示每次调用之间等待固定的毫秒数。 - **fixedDelay**: 上次调用完成后经过固定延时再启动下一次调用。 - **cron**: 使用类似于 Unix cron 的表达式来精确指定何时应该触发任务。 下面是一个简单的例子展示如何创建每五秒钟打印一条消息到日志中的计划任务[^1]: ```java import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component public class MyTaskScheduler { private final Logger logger = LoggerFactory.getLogger(MyTaskScheduler.class); @Scheduled(fixedRate = 5000) public void reportCurrentTime() { logger.info("The time is now {}", System.currentTimeMillis()); } // 更多复杂的调度逻辑... } ``` 对于更复杂的需求,比如每天凌晨两点钟执行某些操作,则可以利用 Cron 表达式的灵活性: ```java @Scheduled(cron = "0 0 2 * * ?") public void scheduledTaskUsingCronExpression(){ logger.info("Executing task at 2 AM every day"); } ``` #### 配置外部化参数 如果希望将这些时间间隔或者其他相关参数放在 application.properties 或者其他形式的外部配置文件里以便于管理和调整,那么可以直接引用这些属性作为 `@Scheduled` 方法上的值。例如,在 properties 文件中设置如下键值对: ```properties app.fixed-rate=5000 app.cron-expression=0 0/5 * * * ? ``` 然后修改 Java 类以读取并应用这些配置项: ```java @Scheduled(fixedRateString = "${app.fixed-rate}") // or @Scheduled(cron = "${app.cron-expression}") ``` 这样做的好处是可以轻松更改定时器的行为而无需重新编译代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值