springboot中设置定时任务有三种常见的方式,分别为:
@Scheduled
注解。下面将分别阐述下这三种方式的实现方式和优缺点。
@Scheduled
注解是Spring Framework提供的一个非常简单的创建定时任务的方法,将注解添加在方法。Spring Boot会自动配置一个任务调度器来执行这些方法。
但需要在Spring Boot应用的主类或配置类上添加@EnableScheduling
注解来启用定时任务的自动配置。然后,你可以在任何Spring管理的bean上使用@Scheduled
注解来声明定时任务。
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class ScheduledTasks {
@Scheduled(fixedRate = 5000)
public void taskWithFixedRate() {
// 任务逻辑
}
@Scheduled(cron = "0 * * * * ?")
public void taskWithCronExpression() {
// 任务逻辑
}
}
@Scheduled(fixedRate = 5000)
是taskWithFixedRate()方法每5秒执行一次。
@Scheduled(cron = "0 * * * * ?")
是taskWithCronExpression()方法根据cron表达式执行。
@Scheduled
注解即可,无需复杂配置。Quartz是一个开源的作业调度库,可以集成到几乎任何Java应用程序中。它提供了丰富的调度选项,包括一次性执行、按照固定间隔重复执行以及基于日历的作业调度。
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-quartzartifactId>
<version>${spring.version}version>
dependency>
package com.account.job;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.stereotype.Component;
/**
* @author Hao
* @date 2023-11-06 17:00
*/
@Component
public class UsernameJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
// 任务逻辑
}
}
package com.account.config;
import com.account.job.UsernameJob;
import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author Hao
* @date 2023-11-06 14:58
*/
@Configuration
public class UsernameQuartzConfig {
@Bean
public JobDetail userLogJob() {
return JobBuilder.newJob(UsernameJob.class)
.storeDurably(true)
.build();
}
@Bean
public Trigger usernameJobTrigger() {
return TriggerBuilder.newTrigger()
.forJob(userLogJob())
.withSchedule(CronScheduleBuilder.cronSchedule("0 30 * * * ?")) //每30分钟执行一次
.build();
}
}
@Scheduled
注解,Quartz需要更多的配置工作。xxl-job是一个分布式任务调度平台,其核心设计目标是开发简单、易扩展、分布式的任务调度解决方案。xxl-job在企业级别的分布式任务调度场景中非常受欢迎。
<xxl-job.version>2.3.1xxl-job.version>
<dependency>
<groupId>com.xuxueligroupId>
<artifactId>xxl-job-coreartifactId>
<version>${xxl-job.version}version>
dependency>
#XXL-job配置
xxl:
job:
admin:
addresses: http://192.168.133.100:9898/xxl-job-admin
accessToken: default_token
executor:
# 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
appname: xxl-job-executor-sample
# 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
port: 9998
package com.replication.config;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author Hao
* @date 2023-12-04 11:07
*/
@Configuration
public class XxlJobConfig {
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
@Value("${xxl.job.accessToken}")
private String accessToken;
@Value("${xxl.job.executor.appname}")
private String appName;
@Value("${xxl.job.executor.port}")
private int port;
@Bean
public XxlJobSpringExecutor xxlJobSpringExecutor() {
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setAppname(appName);
xxlJobSpringExecutor.setPort(port);
return xxlJobSpringExecutor;
}
}
@XxlJob("helloXxl")
public void xxlJob() {
log.debug("xxlJob运行,当前时间:{}", LocalDateTime.now());
}
@Scheduled
注解。在选择定时任务框架时,你应该根据你的应用场景和需求来决定。如果你的应用简单,不需要分布式调度和任务持久化,那么@Scheduled
注解可能是最简单的选择。如果你需要更复杂的调度功能,或者你的应用是分布式的,那么Quartz或xxl-job可能更适合。xxl-job特别适合于需要集中管理和监控任务的大型分布式系统。