SpringBoot实现动态多线程并发定时任务

下面就是SpringBoot实现动态多线程并发定时任务的完整攻略:

1. 确定需求

实现动态多线程并发定时任务,需要确定以下需求:

  1. 动态:能够动态添加或删除任务。
  2. 多线程:任务能够并发执行。
  3. 定时:定时任务能够按照指定的时间周期性地执行。

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

  1. MyJob 类中实现任务逻辑
@Component
public class MyJob extends QuartzJobBean {
    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("Hello World");
    }
}
  1. 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);
    }
}
  1. 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次后删除

  1. 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");
    }
}
  1. 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));
    }
}
  1. 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 实现动态多线程并发定时任务的完整攻略,示例中涉及到了两个场景:

  1. 每隔5秒钟打印一次Hello World;
  2. 每隔10秒钟添加一个任务,任务执行5次后删除。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot实现动态多线程并发定时任务 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • Linux下的多线程编程(三)

    Linux下的多线程编程(三)完整攻略 1. pthread_join函数 pthread_join函数主要用于等待一个线程结束,并获取它的退出状态。函数的原型为: int pthread_join(pthread_t thread, void **retval); 其中,第一个参数thread是要等待的线程ID,如果值为零,则等待任何一个线程。第二个参数r…

    多线程 2023年5月17日
    00
  • GO语言并发编程之互斥锁、读写锁详解

    GO语言并发编程之互斥锁、读写锁详解 什么是互斥锁和读写锁 在并发编程中,多个 goroutine(协程)同时访问某个共享资源,容易出现数据竞争的情况,导致程序出现意想不到的结果或全面崩溃。为了解决这个问题,Go 语言提供了互斥锁(Mutex)和读写锁(RWMutex)的机制。 互斥锁:是一个可以被锁定和解锁的标准计数信号量。在同一时刻,只能有一个 goro…

    多线程 2023年5月17日
    00
  • 深入多线程之:Wait与Pulse的使用详解

    深入多线程之:Wait与Pulse的使用详解 概述 在多线程编程中,Wait和Pulse两个方法可用于线程间的通信。Wait方法会暂停调用线程的执行,直到另一个线程发出信号并重新唤醒等待线程。而Pulse方法用于唤醒一个等待的线程。 Wait方法 Wait方法提供了一种将线程从忙碌状态切换到等待状态的方法,并在发出信号时将线程重新唤醒。它的语法如下所示: M…

    多线程 2023年5月17日
    00
  • PHP使用Pthread实现的多线程操作实例

    下面我将详细介绍如何使用 Pthread 实现 PHP 的多线程操作。 什么是 Pthread Pthread 是 PHP 中的一个扩展库,它支持 POSIX 线程(或称 Pthreads)操作,可以在同一进程中创建多个线程,从而实现并行处理和多线程并发执行等操作。 安装 Pthread 扩展 在使用 Pthread 扩展前,需要先安装该扩展。下面介绍 Pt…

    多线程 2023年5月17日
    00
  • 详解C++ thread用法总结

    详解C++ thread用法总结 什么是C++ thread? C++ thread是一个多线程库,用于在C++中实现多线程编程。多线程是指在同一时间内执行多个线程,从而实现并发执行的目的。C++ thread为程序员提供了创建、启动、等待、终止线程以及互斥锁、条件变量等并发编程工具。 C++ thread用法总结 创建和启动线程 在C++中创建和启动线程可…

    多线程 2023年5月17日
    00
  • C++中的并行与并发基础与使用详解

    C++中的并行与并发基础与使用详解 什么是并行与并发? 并行:同时执行多个任务,多个任务之间相互独立,无需相互协作。 并发:多个任务交替执行,但是任务之间需要通过同步机制来进行协作。 C++中的并行与并发 C++11 提供了许多并行化和并发化的工具,如线程,原子,互斥量等,这些工具都在 std 命名空间中。我们需要包含 <thread>, &lt…

    多线程 2023年5月16日
    00
  • nginx限制并发连接请求数的方法

    这里是详细讲解nginx限制并发连接请求的方法的完整攻略。nginx是一款高性能的web服务器和反向代理服务器,它能够处理并发连接,但是如果同时有太多的请求,可能会对服务器的性能造成负面影响。因此,限制nginx的并发连接请求数往往是必要的。 1. 使用limit_conn_module模块 limit_conn_module是nginx自带的模块之一,可以…

    多线程 2023年5月17日
    00
  • Java线程的基本概念

    Java线程的基本概念 在Java中,一个线程就是一个独立的执行流程,它可以完成特定的任务,以此实现多任务并行处理。Java中的多线程处理提供了一种并发执行应用程序的方式,运行时系统可以同时启动多个线程去执行同一个程序的不同部分,从而提高系统的响应速度和处理能力。 在Java中,线程是由线程对象表示的,线程对象通常在运行时系统中创建,同时,每个线程都有一个与…

    多线程 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部