Springboot-admin整合Quartz实现动态管理定时任务的过程详解

下面就针对“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技术站

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

相关文章

  • JS实现的input选择图片本地预览功能示例

    下面我将为你详细讲解JS实现的input选择图片本地预览功能的攻略。 简介 JS实现的input选择图片本地预览功能,顾名思义,就是可以通过JS代码来实现input表单中选择图片后,在本地预览图片的功能。这类功能一般可以用在上传头像、上传图片等场景中。 过程 下面,我将带你一步步实现这个功能。 第一步:HTML结构 首先,我们需要编写HTML结构,代码如下:…

    Vue 2023年5月28日
    00
  • Vue.js标签页组件使用方法详解

    简述Vue.js标签页组件的作用和功能 Vue.js标签页组件是Vue.js框架中一种用于实现标签页切换功能的组件。它能够方便地实现标签页的切换功能,并支持动态添加或删除标签页的功能。 安装Vue.js标签页组件 Vue.js标签页组件可通过npm或yarn进行安装,如下所示: npm install vue-tabs-component –save ya…

    Vue 2023年5月29日
    00
  • Vue中props的使用详解

    Vue中props的使用详解 什么是props 在Vue中,每个组件都可以接受一些参数,这些参数被称为props。props是一个数组,在组件定义中声明。你可以使用props从父组件中传递数据到子组件中。 如何使用props 在组件定义中声明props属性,用于接收父组件中传递的数据。在组件使用中,使用v-bind指令将需要传递给子组件的数据,绑定到组件的对…

    Vue 2023年5月28日
    00
  • VUE引入使用G2图表的实现

    下面是“VUE引入使用G2图表的实现”的完整攻略,步骤如下: 1. 安装依赖 在VUE项目中使用G2需要引入以下依赖: @antv/g2 @antv/data-set 在终端中依次运行以下命令安装: npm install –save @antv/g2 npm install –save @antv/data-set 2. 创建图表组件 在项目的src/…

    Vue 2023年5月28日
    00
  • vue项目中安装less依赖的过程

    当我们在Vue项目中需要使用less预编译器作为样式开发工具时,需要安装less依赖并进行配置,下面是安装less依赖的完整攻略。 步骤1:安装less依赖 我们可以使用npm或yarn来安装less依赖,以下是两个命令示例: npm安装命令 npm install less less-loader –save-dev yarn安装命令 yarn add …

    Vue 2023年5月28日
    00
  • Vue3.0静态文件存放路径与引用方式

    下面是关于Vue3.0静态文件存放路径与引用方式的完整攻略: 静态文件存放路径 在Vue3.0中,静态文件被默认存放在public文件夹中,该文件夹位于项目根目录下。在public文件夹中,你可以自由创建文件夹存放静态资源,例如images、css、js等文件夹。 值得注意的是,public文件夹中的文件可以被直接引用,例如<img src=”/ima…

    Vue 2023年5月28日
    00
  • 关于vue-tree-chart简单的使用

    关于vue-tree-chart简单的使用其实非常简单,一般包含以下几个步骤: 安装vue-tree-chart npm install vue-tree-chart –save 导入vue-tree-chart 在你需要使用vue-tree-chart的组件中,可以使用以下方式进行引入: “` “` 使用vue-tree-chart 在你需要使用vu…

    Vue 2023年5月29日
    00
  • Vue解析带html标签的字符串为dom的实例

    Vue解析带html标签的字符串为DOM的实例都是通过Vue的渲染函数或者模板渲染来实现的。下面是实现的完整攻略: 组件中使用v-html指令 在Vue组件中,可以使用v-html指令将一个带有HTML标签的字符串解析成DOM实例并渲染到页面中。这是最简单、最常用的实现方法。 示例代码如下: <template> <div> <…

    Vue 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部