SpringBoot学习要点记录(四)----定时任务,异步定时任务

1.使用步骤

  • 在启动类上加上@EnableScheduling注解,表示开启定时任务
  • 在任务类上加上@Scheduled()注解,并设置参数,参数配置如下
配置项类型详细描述
cronString使用表达式的方式定义任务执行时间
zoneString设定区域时间
fixedDelaylong从上一个任务完成开始到下一个任务开始的间隔,单位为毫秒
fixedDelayStringString与 fixedDelay相同只是使用字符串,这样可以使用SpEL来引入配置文件的配置
initialDelaylong在SpringloC容器完成初始化后,首次任务执行延迟时间,单位为毫秒
initialDelayStringString与initialDelay相同,只是使用字符串,这样可以使用SpEL来引入配置文件的配置
fixedRatelong从上一个任务开始到下一个任务开始的间隔,单位为毫秒
fixedRateStringString与fixedRate相同,只是使用字符串,这样可以使用SpEL来引入配置文件的配置

ps:注意 fixedDelay 和 fixedRate 的区别
关于cron 表达式可自行百度,可根据需要在线生成

测试:

/**** imports ****/
@Service
public class ScheduleServiceImpl {
    // 计数器
    int count1 = 1;
    int count2 = 1;
    
    // 每隔1秒执行一次
    @Scheduled(fixedRate = 1000)
    public void task1() {
        System.out.println("【" +Thread.currentThread().getName()+"】"
                + "【task1】每秒钟执行一次,执行第【" + count1 + "】次");

        count1 ++;
    }

    @Scheduled(fixedRate = 1000)
    public void task2() throws Exception{
        System.out.println("【" +Thread.currentThread().getName()+"】"
                + "【task2】每秒钟执行一次,执行第【" + count2 + "】次");
        count2 ++;
    }
}

输出:

【scheduling-1】【task2】每秒钟执行一次,执行第【1】次
【scheduling-1】【task1】每秒钟执行一次,执行第【1】次
【scheduling-1】【task2】每秒钟执行一次,执行第【2】次
【scheduling-1】【task1】每秒钟执行一次,执行第【2】次
【scheduling-1】【task2】每秒钟执行一次,执行第【3】次
【scheduling-1】【task1】每秒钟执行一次,执行第【3】次
 ......

读取配置文件中cron表达式

	@Scheduled(cron = "${TimePointTask01}")
	public void startFirstTask() {
		System.out.println("定时任务执行");
	}

yml配置

#每分钟一次
TimePointTask01: 0 0/1 * * * ?

2.配置异步定时任务

步骤

  • 在启动类上补充@EnableAsync注解,作用:开启 Spring 异步方法执行功能
  • 在任务方法或类上加上@Async注解,作用:该方法或类需要异步线程执行。加在类上指该类所有方法都需要异步执行,加在方法上指方法需要异步执行。
    注意:@EnableAsync和@Async两个注解缺一不可。
@Service
public class ScheduleServiceImpl {
    // 计数器
    int count1 = 1;
    int count2 = 1;
    
    // 每隔1秒执行一次
    @Scheduled(fixedRate = 1000)
    // 使用异步执行
    @Async
    public void task1() {
        System.out.println("【" +Thread.currentThread().getName()+"】"
                + "【task1】每秒钟执行一次,执行第【" + count1 + "】次");
        count1 ++;
    }

    @Scheduled(fixedRate = 1000)
    @Async
    public void task2() throws Exception{
        System.out.println("【" +Thread.currentThread().getName()+"】"
                + "【task2】每秒钟执行一次,执行第【" + count2 + "】次");
        count2 ++;
    }
}

结果:
从输出结果可以看出线程名称是不一样的。

【task-1】【task2】每秒钟执行一次,执行第【1】次
【task-2】【task1】每秒钟执行一次,执行第【1】次
【task-3】【task2】每秒钟执行一次,执行第【2】次
【task-4】【task1】每秒钟执行一次,执行第【2】次
【task-5】【task2】每秒钟执行一次,执行第【3】次
【task-6】【task1】每秒钟执行一次,执行第【3】次
 ......
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值