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

yizhihongxing

下面就针对“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日

相关文章

  • 5个可以加速开发的VueUse函数库(小结)

    让我详细讲解一下“5个可以加速开发的VueUse函数库(小结)”的完整攻略。 标题 首先,需要明确的是,该篇文章的标题应该使用 H1 标题: # 5个可以加速开发的VueUse函数库(小结) 简介 接着,需要写一段文章的简介,简要介绍该篇文章的主要内容,可以参考以下示例: 本文将介绍5个可以加速开发的VueUse函数库,这些函数库大多数都是轻量级的,但是可以…

    Vue 2023年5月27日
    00
  • 京东 Vue3 组件库支持小程序开发的详细流程

    以下是详细讲解“京东 Vue3 组件库支持小程序开发的详细流程”的完整攻略: 1. 准备工作 在开始开发之前,需要先准备好以下工作: 首先安装 Node.js (大于v10.13)和 yarn。 新建一个 Vue3 项目,使用 Vue CLI 搭建,并且安装好小程序开发的相关依赖。 2. 下载并安装组件库 京东 Vue3 组件库已经支持小程序开发,我们可以直…

    Vue 2023年5月27日
    00
  • Vue 应用中结合vux使用微信 jssdk的方法

    下面给出Vue应用中结合vux使用微信jssdk的方法的完整攻略。 一、引入Vux 在Vue应用中使用Vux,需要先进行安装引入。 npm install vux –save 然后在Vue项目的入口文件(一般是main.js文件)中按照如下代码引用Vux: import Vue from ‘vue’ import App from ‘./App.vue’ …

    Vue 2023年5月27日
    00
  • Vue使用lodash进行防抖节流的实现

    下面是我对“Vue使用lodash进行防抖节流的实现”的完整攻略。 什么是防抖和节流 在讲解实现方法之前,我们来介绍一下什么是防抖和节流。 防抖指的是在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新开始计时。防抖常用于用户输入的场景中,如搜索框输入查询关键字。 节流指的是在一个时间段内只执行一次回调函数,即达到规定的执行间隔时间后才执行。常用于页…

    Vue 2023年5月29日
    00
  • vite+vue3.0+ts+element-plus快速搭建项目的实现

    一、背景介绍 在前端开发过程中,我们需要使用一些构建工具来快速搭建项目,而vite是一个新兴的前端构建工具,可以快速构建现代Web应用程序。 Vue3.0是Vue.js框架的最新版本,相比于Vue2.0,性能更加优越、语法更加简洁明了、开发效率更高。 对于TypeScript开发者,TypeScript提供了更强大的类型检查和自动补全功能,可以提高代码的健壮…

    Vue 2023年5月28日
    00
  • Vue之Vue.set动态新增对象属性方法

    下面详细讲解”Vue之Vue.set动态新增对象属性方法”的完整攻略。 什么是Vue.set方法 在Vue.js中,我们经常会用到Vue.set方法,它是Vue.js提供的一个全局API,用于给对象动态添加属性,以便能够响应式地对对象进行渲染。 Vue.set方法的完整语法如下: Vue.set(object, propertyName, value) 其中…

    Vue 2023年5月28日
    00
  • vuex 中辅助函数mapGetters的基本用法详解

    vuex 中辅助函数 mapGetters 的基本用法详解 简介 在 Vuex 中, state 存储着应用中的单一状态树。可以通过 store.state 来获取状态树中的属性。 但是,在有一些情况下,我们需要从 state 中派生一些状态,例如,过滤一些数据或者对数据进行计算,这时可以使用 Getter。Vuex 可以通过 Getter 快速派生出一些状…

    Vue 2023年5月28日
    00
  • Vue中watch使用方法详解

    Vue中watch使用方法详解 在Vue中,watch是一个很强大的功能,可以监听数据的变化,并做出相应的响应。在本篇文章中,我们会详细讲解Vue中watch的使用方法。 1. 监听数据 在Vue中,我们可以通过watch监听某个数据的变化。例如,我们有一个变量message,我们可以通过以下方式来监听message的变化: watch: { message…

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