下面就是SpringBoot实现动态多线程并发定时任务的完整攻略:
1. 确定需求
实现动态多线程并发定时任务,需要确定以下需求:
- 动态:能够动态添加或删除任务。
- 多线程:任务能够并发执行。
- 定时:定时任务能够按照指定的时间周期性地执行。
2. 集成依赖
在 Spring Boot 项目中,我们可以使用 spring-boot-starter-quartz
依赖来集成 Quartz 调度框架。在 pom.xml
文件中添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
3. 配置Quartz参数
在 application.properties
配置文件中配置 Quartz 参数:
# 设置 Quartz 调度器的名称
spring.quartz.scheduler-name = myScheduler
# 设置 Quartz 实例的名称
spring.quartz.properties.org.quartz.scheduler.instanceName = myQuartz
# 禁用更新检查
spring.quartz.properties.org.quartz.scheduler.skipUpdateCheck = true
# 设置 Quartz 应用上下文
spring.quartz.properties.org.quartz.context.key = quartz-context
# 设置 Quartz 线程池的实现方式为 SimpleThreadPool
spring.quartz.properties.org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
# 配置线程池中的线程数
spring.quartz.properties.org.quartz.threadPool.threadCount = 10
4. 定义任务
定义一个继承自 QuartzJobBean
的任务类,实现 executeInternal()
方法。
示例代码如下:
@Component
public class MyJob extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
// 任务执行的逻辑
}
}
5. 添加任务
在 Scheduler
中添加任务。
示例代码如下:
@Component
public class MyScheduler {
@Autowired
private Scheduler scheduler;
public void addJob(String name, String group, String cron) throws SchedulerException {
JobDetail jobDetail = JobBuilder.newJob(MyJob.class).withIdentity(name, group).build();
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(name, group)
.withSchedule(CronScheduleBuilder.cronSchedule(cron)).build();
scheduler.scheduleJob(jobDetail, trigger);
}
}
6. 删除任务
在 Scheduler
中删除任务。
示例代码如下:
@Component
public class MyScheduler {
@Autowired
private Scheduler scheduler;
public void deleteJob(String name, String group) throws SchedulerException {
scheduler.deleteJob(new JobKey(name, group));
}
}
7. 启动任务调度
在 Application
类的 main
方法中,启动任务调度。
示例代码如下:
@SpringBootApplication
public class Application {
public static void main(String[] args) throws SchedulerException {
SpringApplication.run(Application.class, args);
Scheduler scheduler = applicationContext.getBean(Scheduler.class);
scheduler.start();
}
}
示例说明
示例1:每隔5秒钟打印一次Hello World
- 在
MyJob
类中实现任务逻辑
@Component
public class MyJob extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("Hello World");
}
}
- 在
MyScheduler
类中添加任务
@Component
public class MyScheduler {
@Autowired
private Scheduler scheduler;
/**
* 添加任务
* @param name 任务名称
* @param group 任务分组
* @param cron 表达式,每隔5秒钟执行一次
* @throws SchedulerException
*/
public void addJob(String name, String group, String cron) throws SchedulerException {
JobDetail jobDetail = JobBuilder.newJob(MyJob.class).withIdentity(name, group).build();
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(name, group)
.withSchedule(CronScheduleBuilder.cronSchedule(cron)).build();
scheduler.scheduleJob(jobDetail, trigger);
}
}
- 在
Application
类的main
方法中启动任务调度
@SpringBootApplication
public class Application {
public static void main(String[] args) throws SchedulerException {
SpringApplication.run(Application.class, args);
Scheduler scheduler = applicationContext.getBean(Scheduler.class);
scheduler.start();
MyScheduler myScheduler = applicationContext.getBean(MyScheduler.class);
myScheduler.addJob("job1", "group1", "*/5 * * * * ?");
}
}
示例2:每隔10秒钟添加一个任务,任务执行5次后删除
- 在
MyJob
类中实现任务逻辑
@Component
public class MyJob extends QuartzJobBean {
private int count = 0; // 计数器,用来记录任务的执行次数
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
count++;
System.out.println("Job " + jobExecutionContext.getJobDetail().getKey() + " executed " + count + " times");
}
}
- 在
MyScheduler
类中添加任务和删除任务的方法
@Component
public class MyScheduler {
@Autowired
private Scheduler scheduler;
/**
* 添加任务
* @param name 任务名称
* @param group 任务分组
* @param cron 表达式,每隔10秒钟执行一次
* @throws SchedulerException
*/
public void addJob(String name, String group, String cron) throws SchedulerException {
JobDetail jobDetail = JobBuilder.newJob(MyJob.class).withIdentity(name, group).build();
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(name, group)
.withSchedule(CronScheduleBuilder.cronSchedule(cron)).build();
scheduler.scheduleJob(jobDetail, trigger);
}
/**
* 删除任务
* @param name 任务名称
* @param group 任务分组
* @throws SchedulerException
*/
public void deleteJob(String name, String group) throws SchedulerException {
scheduler.deleteJob(new JobKey(name, group));
}
}
- 在
Application
类的main
方法中启动任务调度
@SpringBootApplication
public class Application {
public static void main(String[] args) throws SchedulerException {
SpringApplication.run(Application.class, args);
Scheduler scheduler = applicationContext.getBean(Scheduler.class);
scheduler.start();
MyScheduler myScheduler = applicationContext.getBean(MyScheduler.class);
for (int i = 0; i < 5; i++) {
String jobName = "job" + i;
String groupName = "group1";
String cron = "*/10 * * * * ?";
myScheduler.addJob(jobName, groupName, cron);
// 每隔10秒钟删除一次任务
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
myScheduler.deleteJob(jobName, groupName);
}
}
}
以上就是 SpringBoot 实现动态多线程并发定时任务的完整攻略,示例中涉及到了两个场景:
- 每隔5秒钟打印一次Hello World;
- 每隔10秒钟添加一个任务,任务执行5次后删除。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot实现动态多线程并发定时任务 - Python技术站