一、springboot动态定时任务
在Spring Boot中,我们可以使用Spring自带的@Scheduled注解来实现定时任务。但是,如果我们需要动态地添加、修改、删除定时,该怎么办呢?这时候,我们可以使用Quartz框架来实现动态定时任务。
Quartz是一个开源的作业调度框架,可以用来实现复杂的作业调度需求。它支持动态添加、修改、删除作业,支持集群部署,支持持久化作业信息等。
在Spring Boot中,我们可以通过集成Quartz框架来实现动态定时任务。具体步骤如下:
1. 引入Quartz依赖
在pom.xml文件中添加以下依赖:
“`
dependency>
version>2.3.2
“`
2. 配置Quartz
在application.properties文件中添加以下配置:
“`
# 配置Quartz的数据源
spring.quartz.job-store-type=jdbc
spring.quartz.jdbc.initialize-schema=always
spring.quartz.properties.org.quartz.dataSource.myDS.driver=com.mysql.jdbc.Driver
spring.quartz.properties.org.quartz.dataSource.myDS.URL=jdbc:mysql://localhost:3306/quartzuseUnicode=true&characterEncoding=utf-8&useSSL=false
spring.quartz.properties.org.quartz.dataSource.myDS.user=root
spring.quartz.properties.org.quartz.dataSource.myDS.password=root
# 配置Quartz的调度器
spring.quartz.scheduler.instanceName=myScheduler
spring.quartz.scheduler.instanceId=AUTO
spring.quartz.scheduler.skipUpdateCheck=true
spring.quartz.scheduler.jobFactory.class=org.springframework.scheduling.quartz.SpringBeanJobFactory
spring.quartz.job-store.class=org.quartz.impl.jdbcjobstore.JobStoreTX
spring.quartz.job-store.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
spring.quartz.job-store.dataSource=myDS
spring.quartz.job-store.tablePrefix=QRTZ_
spring.quartz.job-store.isClustered=true
spring.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
spring.quartz.threadPool.threadCount=10
“`
3. 创建定时任务
创建一个继承自QuartzJobBean的类,实现executeInternal方法,该方法中编写定时任务的逻辑。
“`
public class MyJob extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
// 定时任务逻辑
}
}
“`
4. 添加定时任务
在需要添加定时任务的地方,注入SchedulerFactoryBean,并调用其getScheduler方法获取Scheduler对象。然后,创建一个JobDetail对象和一个Trigger对象,将它们传入Scheduler的scheduleJob方法中即可。
“`
@Autowired
private SchedulerFactoryBean schedulerFactoryBean;
public void addJob() throws SchedulerException {
Scheduler scheduler=schedulerFactoryBean.getScheduler();
JobDetail jobDetail=JobBuilder.newJob(MyJob.class).withIdentity(“job1”, “group1”).build();
Trigger trigger=TriggerBuilder.newTrigger().withIdentity(“trigger1”, “group1”).startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(10).repeatForever()).build();
scheduler.scheduleJob(jobDetail, trigger);
}
“`
5. 修改定时任务
修改定时任务也很简单,只需要先获取到要修改的JobDetail和Trigger对象,然后调用Scheduler的rescheduleJob方法即可。
“`
public void modifyJob() throws SchedulerException {
Scheduler scheduler=schedulerFactoryBean.getScheduler();
JobDetail jobDetail=scheduler.getJobDetail(JobKey.jobKey(“job1”, “group1”));
Trigger trigger=scheduler.getTrigger(TriggerKey.triggerKey(“trigger1”
, “group1”));
trigger=trigger.getTriggerBuilder().withIdentity(trigger.getKey()).withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(20).repeatForever()).build();
scheduler.rescheduleJob(trigger.getKey(), trigger);
}
“`
6. 删除定时任务
删除定时任务也很简单,只需要调用Scheduler的deleteJob方法即可。
“`
public void deleteJob() throws SchedulerException {
Scheduler scheduler=schedulerFactoryBean.getScheduler();
scheduler.deleteJob(JobKey.jobKey(“job1”, “group1”));
}
“`
二、springboot自动配置原理
Spring Boot的自动配置是通过条件注解实现的。条件注解是Spring 4.0引入的一个新特性,它可以根据一定的条件来决定是否启用某个配置类或某个Bean。
Spring Boot中的自动配置类都是以AutoConfiguration结尾的,比如DataSourceAutoConfiguration、JdbcTemplateAutoConfiguration等。这些自动配置类都使用了条件注解来判断是否需要Configuration为例,它的源码如下:
“`
@Configuration
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
@EnableConfigurationProperties(DataSourceProperties.class)
@Import({ DataSourcePoolMetadataProvidersConfiguration.class, DataSourceInitializationConfiguration.class })
public class DataSourceAutoConfiguration {
@Bean
@ConditionalOnMissingBean
@ConfigurationProperties(prefix=”spring.datasource.hikari”)
public HikariDataSource dataSource(DataSourceProperties properties) {
// 创建HikariDataSource对象
}
}
“`
该类使用了@Configuration注解,表示它是一个配置类。它还使用了@ConditionalOnClass注解,表示只有当DataSource和EmbeddedDatabaseType类存在时才启用该配置类。它还使用了@EnableConfigurationProperties注解,表示启用@ConfigurationProperties注解,将配置文件中的属性注入到DataSourceProperties类中。最后,它还定义了一个名为dataSource的Bean,使用了@ConditionalOnMissingBean注解,表示只有当容器中不存在名为dataSource的Bean时才创建该Bean。
通过这些条件注解的组合,Spring Boot可以根据一定的条件来决定是否启用某个配置类或某个Bean,从而实现自动配置的功能。
常见问题FAQ
- 本站资源可以代理扶持吗?有没有售后和技术支持?
- 具体请参照:https://www.wxzygp.com/345.html
- 遇到问题无法解决怎么办?
- 免费下载或者VIP会员资源能否直接商用?
- 购买该资源后,可以退款吗?