下面我将为您详细讲解 Spring Boot 如何通过 @Scheduled
实现定时任务及多线程配置。
什么是@Scheduled?
@Scheduled
是 Spring 框架提供的用于定时执行任务的注解,通过它可以配置定时执行的任务的时间。我们可以通过该注解实现定时任务的执行。
如何使用@Scheduled ?
在使用 @Scheduled
注解之前,需要在启动类上添加 @EnableScheduling
注解,该注解会启动 Spring Boot 对定时任务的支持。
@SpringBootApplication
@EnableScheduling
public class SpringBootDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootDemoApplication.class, args);
}
}
然后再在需要执行定时任务的方法上添加 @Scheduled
注解,并根据我们的需要设置时间表达式。时间表达式的语法与 Linux 的 crontab 语法类似,如下所示:
@Scheduled(cron="0 0/1 * * * ?") // 每分钟执行一次
public void doSomething() {
// todo
}
或者使用固定的时间间隔,如下所示:
@Scheduled(fixedRate = 60000) // 每 60 秒执行一次
public void doSomething() {
// todo
}
多线程配置
在使用 @Scheduled
注解时,如果我们不进行多线程配置,那么任务将会在定时任务所在的线程中执行,如果定时任务的逻辑比较耗时,就会导致整个线程挂起,影响整个应用的性能。
所以我们需要将定时任务的逻辑放到新的线程中运行,以异步方式执行定时任务。
我们可以通过 @EnableAsync
注解来开启 Spring Boot 对异步任务的支持,然后再将异步执行的任务方法上加上 @Async
注解,如下所示:
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.Async;
@SpringBootApplication
@EnableScheduling
@EnableAsync // 开启 Spring 对异步任务的支持
public class SpringBootDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootDemoApplication.class, args);
}
@Async // 声明方法使用异步方式执行
@Scheduled(fixedRate = 60000) // 每 60 秒执行一次
public void doSomething() {
// todo
}
}
这样,定时任务就可以使用新的线程执行,不会影响整个应用的性能。
示例说明
下面示例将展示如何使用 @Scheduled
注解定时执行任务并使用多线程配置。
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
@SpringBootApplication
@EnableScheduling
@EnableAsync // 开启 Spring 对异步任务的支持
public class SpringBootDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootDemoApplication.class, args);
}
@Async // 声明方法使用异步方式执行
@Scheduled(fixedRate = 5000) // 每 5 秒执行一次
public void task() {
System.out.println("定时任务开始,线程名:" + Thread.currentThread().getName());
try {
Thread.sleep(3000); // 模拟耗时操作
System.out.println("定时任务结束,线程名:" + Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
在上述示例中,我们定义了一个定时任务 task
,并使用 @Async
注解启用异步执行,@Scheduled(fixedRate = 5000)
表示每隔 5 秒执行一次 task
方法。在 task
方法中打印线程名并模拟耗时操作,以便观察异步执行的效果。
启动应用后,我们可以在控制台看到每隔 5 秒输出一次类似如下的日志:
定时任务开始,线程名:scheduling-1
定时任务结束,线程名:task-1
可以看到,每次定时任务都在新的线程中异步执行,不会阻塞应用主线程的执行,避免了性能问题。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring boot如何通过@Scheduled实现定时任务及多线程配置 - Python技术站