SpringBoot整合quartz(自启动 job -- 数据库可配置版本)

首先导入配置类(项目启动预加载)

  • 背景:项目启动后,SpringBoot 通过数据库配置实现可配置job任务工作,目前的功能算个半自动,更改数据库配置信息的话 就需要重新重启服务了。

      SpringBoot整合quartz(支持多任务和job,支持spring管理)
      框架:SpringBoot + quartz
      
      所需要的依赖:
         <!--quartz-->
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-quartz</artifactId>
          </dependency>
    
  • 1.导入配置类
package xxx;

import xxx.entity.ScheduleJob;
import xxx.repository.ScheduleJobRepository;
import org.quartz.SchedulerException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;

import java.util.List;

@Configuration
public class SchedulerListener implements ApplicationListener<ContextRefreshedEvent> {
   
   

    @Autowired
    Scheduler Scheduler;

    @Autowired
    JobFactory JobFactory;

    @Autowired
    ScheduleJobRepository ScheduleJobRepository;

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
   
   
    	//数据库查询配置信息  换你自己的逻辑
        List<ScheduleJob> ScheduleJobAll = ScheduleJobRepository.findAll(); 
        try {
   
   
            Scheduler.schedulerJob(ScheduleJobAll);
            System.out.println("SynchronizedData job  start...");
        } catch (SchedulerException | ClassNotFoundException e) {
   
   
            e.printStackTrace();
        }
    }

    @Bean(name ="mySchedulerFactoryBean")
    public SchedulerFactoryBean mySchedulerFactory() {
   
   
        SchedulerFactoryBean bean = new SchedulerFactoryBean();
        bean.setOverwriteExistingJobs(true);
        bean.setStartupDelay(1);
        bean.setJobFactory(JobFactory);
        return bean;
    }
}

  • 2.导入应用程序启动时自动扫描并加载的组件1
package xxx.conf.quartz;

import xxx.entity.ScheduleJob;
import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.quartz.impl.StdScheduler;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;

import java.util.List;

@Slf4j
@Component
public class Scheduler {
   
   

    public static JobKey getJobKey(String jobId, String jobGroup) {
   
   
        return JobKey.jobKey(jobId, jobGroup);
    }

    public void schedulerJob(List<ScheduleJob> scheduleJobList) throws SchedulerException, ClassNotFoundException {
   
   
        ApplicationContext annotationContext = SpringUtil.getApplicationContext();
        StdScheduler stdScheduler = (StdScheduler) annotationContext.getBean("mySchedulerFactoryBean");//获得上面创建的bean
        org.quartz.Scheduler myScheduler 
### 整合Spring BootQuartz实现数据库持久化的作业调度 #### 配置依赖项 为了使Spring Boot应用程序能够支持Quartz并利用`quartz-jobs`库来完成数据库中的作业存储,需先调整项目的构建文件。对于Maven项目,在`pom.xml`中加入如下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> <!-- Quartz Jobs --> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz-jobs</artifactId> <version>${quartz.version}</version> </dependency> ``` 上述配置引入了必要的组件用于启动和管理定时任务以及通过JDBC连接到关系型数据库保存job详情[^1]。 #### 数据源设置 接着定义数据源属性以便于Quartz可以访问外部数据库执行持久操作。编辑`application.properties`或`application.yml`: ```yaml spring.datasource.url=jdbc:mysql://localhost:3306/quartz_db?useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=password spring.jpa.hibernate.ddl-auto=update ``` 这里指定了MySQL作为后台存储介质;当然也可以选择其他类型的RDBMS只要相应修改URL即可满足需求[^4]。 #### 初始化表结构 为了让Quartz能在指定的数据源上创建所需的表格,应该下载官方提供的SQL脚本并将之应用于目标schema内。通常这些DDL语句位于Quartz发行版下的`docs/dbTables`目录下找到适合版本的建表语句应用至实际环境中[^2]。 #### 自定义Job类 编写具体的业务逻辑单元即所谓的Jobs, 它们代表待被执行的任务体。下面给出一个简单的例子展示怎样继承自`Job`接口从而形成可被调度器识别的对象形式: ```java import org.quartz.Job; import org.quartz.JobExecutionContext; public class SampleJob implements Job { @Override public void execute(JobExecutionContext context){ System.out.println("Executing sample job at " + new Date()); } } ``` 此段代码实现了基本的日志记录功能每当触发条件达成时就会打印当前时间戳信息给控制台输出流[^3]。 #### 调度策略设定 最后一步就是安排何时何地运行已注册好的jobs了。这可以通过编程方式动态添加trigger实例或者静态声明的方式预先确定好计划参数。以下是采用Java Config风格的例子说明如何做到这一点: ```java @Configuration @EnableScheduling public class SchedulerConfig { @Autowired private ApplicationContext applicationContext; @Bean public JobDetailFactoryBean jobDetail(){ JobDetailFactoryBean factory = new JobDetailFactoryBean(); factory.setJobClass(SampleJob.class); factory.setDescription("Invoke SampleJob"); return factory; } @Bean public CronTriggerFactoryBean cronTrigger() throws ParseException{ CronTriggerFactoryBean trigger = new CronTriggerFactoryBean(); trigger.setCronExpression("*/5 * * * * ?"); //每五秒一次 trigger.setJobDetail(jobDetail().getObject()); return trigger; } } ``` 这段配置片段设置了每隔五分钟就激活一次之前提到过的SampleJob示例程序。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值