以下是关于“Spring Boot中实现定时任务应用实践”的完整攻略。
1. 添加依赖
首先,在pom.xml
文件中添加spring-boot-starter-quartz
依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
2. 配置Quartz
在application.properties
文件中添加Quartz的配置信息:
# 配置Quartz
spring.quartz.properties.org.quartz.scheduler.instanceName=SpringBootQuartzTask
spring.quartz.properties.org.quartz.scheduler.instanceId=1
spring.quartz.properties.org.quartz.scheduler.skipUpdateCheck=true
spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
spring.quartz.properties.org.quartz.jobStore.dataSource=quartzDataSource
spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_
spring.quartz.properties.org.quartz.jobStore.isClustered=true
spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=20000
spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
spring.quartz.properties.org.quartz.threadPool.threadCount=10
spring.quartz.properties.org.quartz.threadPool.threadPriority=5
spring.quartz.properties.org.quartz.dataSource.quartzDataSource.driverClassName=org.postgresql.Driver
spring.quartz.properties.org.quartz.dataSource.quartzDataSource.URL=jdbc:postgresql://localhost:5432/quartz
spring.quartz.properties.org.quartz.dataSource.quartzDataSource.user=postgres
spring.quartz.properties.org.quartz.dataSource.quartzDataSource.password=passwd
spring.quartz.properties.org.quartz.dataSource.quartzDataSource.maxConnections=10
其中,org.quartz.dataSource.quartzDataSource.URL
是Quartz的数据源配置,你可以根据自己的数据库类型进行配置。
3. 定义定时任务
在Job
类中定义定时任务:
@Component
public class ScheduleTask implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("Hello, Quartz!");
}
}
其中,@Component
注解表示这是一个Spring的组件,用于实现Bean的依赖注入。
4. 配置定时任务
在定时任务配置类中,配置排程任务:
@Configuration
public class QuartzConfig {
@Bean
public JobDetail jobDetail() {
return JobBuilder.newJob(ScheduleTask.class) //指定需要执行的任务类
.storeDurably().build();
}
@Bean
public Trigger trigger() {
SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(10) //每10s执行一次
.repeatForever();
return TriggerBuilder.newTrigger().forJob(jobDetail())
.withSchedule(scheduleBuilder).build();
}
}
jobDetail()
方法返回的是JobDetail
对象,其中需要指定需要执行的任务类(即ScheduleTask
),同时将其设置为持久化存储。trigger()
方法返回的是Trigger
对象,其中需要指定任务执行的时间间隔。
5. 测试
新建一个Spring Boot项目,并在Application
类中添加@EnableScheduling
注解启用定时任务功能:
@SpringBootApplication
@EnableScheduling
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
最后,运行项目,你会发现Quartz定时任务已经被自动执行,每10秒钟打印一次“Hello, Quartz!”。
示例1
在TaskService
中添加一个定时任务:
@Service
public class TaskService {
@Scheduled(cron = "0 0/1 * * * ?")
public void job() {
System.out.println("开始执行定时任务: " + LocalDateTime.now());
}
}
cron
表达式中,0 0/1 * * * ?
表示每分钟执行一次。
示例2
添加通过@Scheduled
注解动态改变定时任务执行时间:
@Service
public class TaskService {
private static final Logger logger = LoggerFactory.getLogger(TaskService.class);
private ScheduledExecutorService service = Executors.newScheduledThreadPool(1);
// 定时任务句柄,用于修改定时任务执行时间
private ScheduledFuture<?> future;
/**
* 启动定时任务
*
* @param rate 时间间隔(单位:秒)
*/
public void start(int rate) {
if (future != null) {
future.cancel(false);
}
future = service.scheduleAtFixedRate(() ->
logger.info("Hello, Scheduled Task!"),
0, rate, TimeUnit.SECONDS);
}
}
start
方法中,通过service.scheduleAtFixedRate()
方法实现动态改变定时任务执行时间。
以上就是关于“Spring Boot中实现定时任务应用实践”的完整攻略和多个示例。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot中实现定时任务应用实践 - Python技术站