下面就针对“Springboot-admin整合Quartz实现动态管理定时任务的过程详解”进行详细讲解。
一、背景介绍
在实际的开发过程中,定时任务的使用频率非常高。而对于Spring Boot项目来说,使用Quartz框架来实现定时任务是一种常见的做法。但是,随着业务的不断发展,我们的定时任务往往需要频繁地进行修改和管理,此时我们可以借助Springboot-admin来实现动态管理定时任务。
二、Springboot-admin整合Quartz实现动态管理定时任务的过程
1. 引入依赖
首先,我们需要在pom.xml文件中加入如下依赖:
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>2.4.2</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.3.0</version>
</dependency>
2. 配置数据源
接下来,我们需要在application.yml文件中配置数据源,以便Quartz能够正常运行。
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false
username: root
password: root
3. 配置Quartz
接着,在Spring Boot项目中创建一个QuartzConfig配置类,如下所示:
@Configuration
public class QuartzConfig {
// 配置SchedulerFactoryBean
@Bean
public SchedulerFactoryBean schedulerFactoryBean() {
SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
schedulerFactoryBean.setJobFactory(jobFactory());
schedulerFactoryBean.setQuartzProperties(quartzProperties());
schedulerFactoryBean.setDataSource(dataSource());
schedulerFactoryBean.setSchedulerName("myScheduler");
schedulerFactoryBean.setApplicationContextSchedulerContextKey("applicationContext");
return schedulerFactoryBean;
}
// 配置JobFactory
@Bean
public JobFactory jobFactory() {
return new SpringBeanJobFactory();
}
// 配置Quartz属性
@Bean
public Properties quartzProperties() {
Properties properties = new Properties();
properties.setProperty("org.quartz.scheduler.instanceName", "MyScheduler");
properties.setProperty("org.quartz.scheduler.instanceId", "AUTO");
properties.setProperty("org.quartz.jobStore.class", "org.quartz.impl.jdbcjobstore.JobStoreTX");
properties.setProperty("org.quartz.jobStore.driverDelegateClass", "org.quartz.impl.jdbcjobstore.StdJDBCDelegate");
properties.setProperty("org.quartz.jobStore.tablePrefix", "QRTZ_");
properties.setProperty("org.quartz.jobStore.dataSource", "myDS");
properties.setProperty("org.quartz.jobStore.isClustered", "false");
properties.setProperty("org.quartz.dataSource.myDS.driver", "com.mysql.jdbc.Driver");
properties.setProperty("org.quartz.dataSource.myDS.URL", "jdbc:mysql://localhost:3306/test?useSSL=false");
properties.setProperty("org.quartz.dataSource.myDS.user", "root");
properties.setProperty("org.quartz.dataSource.myDS.password", "root");
properties.setProperty("org.quartz.dataSource.myDS.maxConnections", "10");
return properties;
}
}
4. 创建任务
接下来,我们创建一个定时任务Job:
@Component
public class HelloJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("Hello, world!");
}
}
5. 添加定时任务
我们通过编写一个Controller,实现添加定时任务的功能。
@RestController
public class JobController {
@Autowired
private Scheduler scheduler;
@PostMapping("/addJob")
public String addJob(String jobName, String jobGroupName, String triggerName,
String triggerGroupName, String cronExpression, String description) {
try {
// 创建JobDetail
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity(jobName, jobGroupName).withDescription(description).build();
// 创建Trigger
Trigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerName, triggerGroupName)
.withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)).build();
// 设置调度任务
scheduler.scheduleJob(jobDetail, trigger);
return "success";
} catch (Exception e) {
e.printStackTrace();
return "fail";
}
}
}
6. 启动项目
最后,在Spring Boot项目的启动类上添加@EnableScheduling和@EnableAdminServer注解,即可启动项目了。
@SpringBootApplication
@EnableScheduling
@EnableAdminServer
public class QuartzDemoApplication {
public static void main(String[] args) {
SpringApplication.run(QuartzDemoApplication.class, args);
}
}
三、示例说明
示例1:动态添加并启动定时任务
我们可以通过发送一个POST请求来添加一条定时任务,具体如下:
```http request
POST http://localhost:8080/addJob?jobName=myJob&jobGroupName=myGroup&triggerName=myTrigger&triggerGroupName=myGroup
HTTP/1.1
Content-Type: application/json;charset=UTF-8
{
"cronExpression": "0/30 * * * * ?",
"description": "这是定时任务的描述信息"
}
其中,请求参数中指定了定时任务的名称、组名、触发器名称和组名,在服务端创建并启动该定时任务。不同的定时任务可以根据需求自定义cron表达式,以满足不同的调度需求。
### 示例2:动态停止定时任务
我们还可以通过发送一个POST请求来停止一条定时任务,具体如下:
```http request
POST http://localhost:8080/removeJob?jobName=myJob&jobGroupName=myGroup&triggerName=myTrigger&triggerGroupName=myGroup
HTTP/1.1
Content-Type: application/json;charset=UTF-8
其中,请求参数中指定了定时任务的名称、组名、触发器名称和组名,在服务端停止该定时任务的运行。需要注意的是,这里的停止只是暂停了定时任务的运行,但并没有彻底删除定时任务。如果希望删除某个定时任务,可以通过在服务端手动删除或者在应用重启后自动删除来实现。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Springboot-admin整合Quartz实现动态管理定时任务的过程详解 - Python技术站