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日

相关文章

  • Java多线程 自定义线程池详情

    Java多线程 自定义线程池详情 什么是线程池? 线程池是一种线程复用的机制,用于管理与分配线程。在程序中,线程池预先为一组可重用的线程分配了一定数量的线程。这些线程对于一定数量的任务是可用的。一旦指定了任务,就将任务放入队列中排队等待线程。一旦有可用的线程,它就会从队列中取出一个任务并处理它。 JDK内置的线程池 在JDK中,可以使用Executors类创…

    多线程 2023年5月17日
    00
  • 微信小程序解除10个请求并发限制

    微信小程序解除10个请求并发限制攻略 在微信小程序的开发中,我们发现在一个页面同时发出多个请求时,最多只能同时发出10个请求,这个限制影响了小程序的并发能力。本文将介绍如何解除这个限制。 1. 原因 微信小程序同时请求的数量是有限制的,默认情况下是10个。这是为了避免小程序发送过多的请求导致服务器超载。另外,微信小程序还有IP访问频率的限制。超过一定频率会被…

    多线程 2023年5月16日
    00
  • SpringBoot项目的多文件兼多线程上传下载

    下面我将详细讲解SpringBoot项目的多文件兼多线程上传下载的完整攻略。 1. 多文件上传 1.1 前端页面实现 第一步是实现前端页面,让用户可以选择并上传多个文件。在html文件中,使用<input type=”file” multiple>标签实现多个文件上传,代码如下: <form action="/upload&quo…

    多线程 2023年5月16日
    00
  • 分析详解python多线程与多进程区别

    分析详解Python多线程与多进程区别 在Python中多线程和多进程是用来实现并发编程的两种不同的机制。在开始学习这两种技术之前,我们必须了解它们的异同之处,以便我们能够采用最合适的技术来解决具体问题。 什么是多线程? 多线程是将一个进程内部的任务分为不同的线程来进行同时执行的机制。每个线程都有自己的代码,自己的栈以及自己的寄存器,但是它们之间共享进程的内…

    多线程 2023年5月16日
    00
  • Go语言并发模型的2种编程方案

    Go语言是一门支持并发编程的编程语言,它的并发模型让程序员可以利用多核CPU的优势进行高效的并发编程,提高程序性能。在Go语言中,可以使用goroutine和channel实现并发。下面,我们来详细讲解Go语言并发模型的2种编程方案。 方案1:使用Goroutine实现并发 Goroutine是Go语言提供的一种轻量级的并发机制,它可以在单个线程内同时运行多…

    多线程 2023年5月17日
    00
  • Erlang中的并发程序简介

    Erlang中的并发程序简介 什么是Erlang并发程序? Erlang是一种面向并发性的编程语言,它通过基于Actor模型来处理并发。在Erlang中,每个进程都是Actor,这些进程可以相互通信,并且不会破坏彼此的状态。Erlang的并发性能力非常强大,因为它是并行执行的,并且进程之间不会出现竞争条件或死锁问题。 Erlang并发程序的基本结构 在Erl…

    多线程 2023年5月17日
    00
  • Java多线程Thread类的使用及注意事项

    Java多线程Thread类的使用及注意事项 简介 Java是一种多线程语言,这意味着Java中的程序可以同时执行多个线程。Java程序中的每一个线程都有一个执行路径,并且可以同时执行多个任务。Java中的Thread类是用于创建和管理线程的类。 创建Thread对象 要创建一个Thread对象,可以使用以下构造函数: Thread() Thread(Run…

    多线程 2023年5月17日
    00
  • Spring boot使用多线程过程步骤解析

    Spring Boot使用多线程过程步骤解析 在Web应用程序中,通常需要进行一些异步处理操作,例如将数据处理后保存至数据库;向其他系统发送请求并等待其响应等操作。使用多线程技术能够更好地满足这些需求。在Spring Boot中,使用多线程需要遵循以下步骤: 步骤1:创建一个线程池 Spring Boot中使用ThreadPoolTaskExecutor类来…

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