Quartz框架

本文详细介绍Quartz定时任务框架的使用方法,包括其数据库表结构解析、Spring项目中的配置步骤,并提供具体Job实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Quartz的介绍

关于Quartz的介绍网上有很多很多,但是在浏览了很多的文章之后,在这里优先推荐给大家的有如下几个以供大家理解,在这里感谢作者的辛苦贡献。
参考一(翻译版):https://xuzongbao.gitbooks.io/quartz/content/chapter1.html
参考二(开发API):https://www.quartz-scheduler.org/api/2.2.1/index.html
参考三(博客):https://blog.youkuaiyun.com/guolong1983811/article/details/51501346

目前quartz框架更新到2.2.1版,网上有需要的SQL直接可以使用,要注意使用时版本需要对应。
包含的几张表的含义如下:

  1. qrtz_blob_triggers : 以Blob 类型存储的触发器。
  2. qrtz_calendars:存放日历信息, quartz可配置一个日历来指定一个时间范围。
  3. qrtz_cron_triggers:存放cron类型的触发器。
  4. qrtz_fired_triggers:存放已触发的触发器。
  5. qrtz_job_details:存放一个jobDetail信息。
  6. qrtz_job_listeners:job监听器。
  7. qrtz_locks: 存储程序的悲观锁的信息(假如使用了悲观锁)。
  8. qrtz_paused_trigger_graps:存放暂停掉的触发器。
  9. qrtz_scheduler_state:调度器状态。
  10. qrtz_simple_triggers:简单触发器的信息。
  11. qrtz_trigger_listeners:触发器监听器。
  12. qrtz_triggers:触发器的基本信息。

如何整合Quartz到Spring项目

引入quartz

pom.xml文件中引入quartz坐标

<dependency>
  <groupId>org.quartz-scheduler</groupId>
  <artifactId>quartz</artifactId>
  <version>2.2.1</version>
</dependency>

<dependency>
  <groupId>org.quartz-scheduler</groupId>
  <artifactId>quartz-jobs</artifactId>
  <version>2.2.1</version>
</dependency>

quartz.properties配置文件

quartz框架有默认的quartz.properties配置文件,要是和默认配置文件的名字相同并且在resource根目录下,则会自动覆盖默认的配置文件。要是不放在次位置,可以在xml配置文件中引用制定位置的配置文件。要是没有配置文件,则使用自带默认的。

# 调度器的名称
org.quartz.scheduler.instanceName = MyScheduler
# 线程数量 执行调度最大的线程数
org.quartz.threadPool.threadCount = 5
# 调度实例失效的检查时间间隔
org.quartz.jobStore.clusterCheckinInterval = 20000
# 数据保存方式 持久化到数据库
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
# 数据库平台 mysql
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
# 表的前缀
org.quartz.jobStore.tablePrefix = QRTZ_
# 数据库别名 spring配置数据源 则这里配置的数据源不起作用 在spring中指定quartz的数据源
# org.quartz.jobStore.dataSource = myDS

# org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver
# org.quartz.dataSource.myDS.URL = jdbc\:mysql\:(自己的DB的url)
# org.quartz.dataSource.myDS.user = (连接数据库的用户名)
# org.quartz.dataSource.myDS.password = (密码)
# org.quartz.dataSource.myDS.maxConnections = 5

上面的两步基本上将quartz就引入到项目中了。下面具体在以springmvc项目和springboot项目为例做一下配置。

SpringBoot项目中quartz的配置

在这里的配置若在quartz.properties配置文件中已经存在,则这里的会生效。

@Configuration
@ConditionalOnProperty(name = "quartz.enabled")
public class QuartzConfiguration {

    @Autowired
    AutowiringSpringBeanJobFactory autowiringSpringBeanJobFactory;

    @Bean
    public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource) throws Exception {
        SchedulerFactoryBean factory = new SchedulerFactoryBean();
        factory.setDataSource(dataSource);
        factory.setConfigLocation(new ClassPathResource("/quartz.properties"));
        factory.setJobFactory(autowiringSpringBeanJobFactory);
        factory.afterPropertiesSet();
        return factory;
    }
}

下面的这个Bean继承SpringBeanJobFactory 和实现了 ApplicationContextAware, 这样在具体的Job就可以使用Spring 注解的方式注入其他Bean。在这里实际上是将quartz交给Spring来统一管理。

@Component
public class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory implements ApplicationContextAware {
    private transient AutowireCapableBeanFactory beanFactory;

    @Override
    public void setApplicationContext(final ApplicationContext context) {
        beanFactory = context.getAutowireCapableBeanFactory();
    }

    @Override
    protected Object createJobInstance(final TriggerFiredBundle bundle) throws Exception {
        final Object job = super.createJobInstance(bundle);
        beanFactory.autowireBean(job);
        return job;
    }
}

SpringMVC项目中quartz的配置

<!--配置Quartz 完全基于数据库,无需配置自定义的job类-->
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
   <!-- 以下配置实现了job的持久化 (JobStoreTX)-->
   <!-- 事先在数据库里面配置好quartz的信息,然后quartz自动去读取,并实例化 -->
   <!-- 运行资源文件QuartzTable.sql文件,就配置好了相关的信息三张表 -->
   <property name="jobFactory">
      <bean class="com.xxx.xxx.business.quartz.factory.AutowiringSpringBeanJobFactory"/>
   </property>
   <!--指定spring中的数据源为 quartz的数据源 使用healthDB的数据源做为数据源-->
   <property name="dataSource" ref="dataSourceQuartz" />
   <property name="configLocation" value="classpath:quartz.properties" />
   <property name="applicationContextSchedulerContextKey"
           value="applicationContextKey" />
   <property name="autoStartup" value="true" />
</bean>
public class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory implements ApplicationContextAware {
    private transient AutowireCapableBeanFactory beanFactory;

    @Override
    public void setApplicationContext(final ApplicationContext context) {
        beanFactory = context.getAutowireCapableBeanFactory();
    }

    @Override
    protected Object createJobInstance(final TriggerFiredBundle bundle) throws Exception {
        final Object job = super.createJobInstance(bundle);
        beanFactory.autowireBean(job);
        return job;
    }
}

定义一个Job

上面基本上将quartz的基本配置就做好了,quartz就直接可以使用了。

@Component
@DisallowConcurrentExecution // 有状态的JOB,防止同一时间重复执行
public class RealTimeJob implements Job {

    @Autowired
    SchedulerFactoryBean scheduler;
    @Autowired
    JobExecuteService jobExecuteService;

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        String nowDate = DateUtils.getNowDate();
        try {
            jobExecuteService.doRealTimeJob();
        } catch (Exception e) {
            logger.error("时间:"+ nowDate + ",执行任务出现异常...", e);
        }
    }
}

要执行的任务直接实现Job类,重写execute方法,这个类加入Job的调度之后,就会自动执行execute中的具体业务。

问题整理

  • Job和Trigger的关系:

一个Job可以绑定多个Trigger,但是一个Trigger只能指定一个Job。并且Trigger必须绑定Job,而Job可以不用绑定Trigger。

### Quartz框架使用指南 Quartz 是一个功能强大的开源作业调度框架,广泛应用于需要执行定时任务的应用程序中。以下是关于 Quartz 的一些核心概念及其使用方法: #### 1. 高级特性和资源支持 Quartz 提供了许多高级特性,例如集群支持、持久化存储以及复杂的触发器配置等[^1]。这些特性使得 Quartz 能够适应各种复杂场景下的任务调度需求。 如果在开发过程中遇到困难,可以通过查阅官方文档中的 **FAQ** 获取解决方案。此外,Quartz 官方还提供了详细的 Javadoc 文档,其中包含了所有类和方法的具体说明,这对于开发者理解 API 和编写代码具有极大的帮助价值。 #### 2. Maven 项目集成 为了快速上手 Quartz,可以从创建一个简单的 Maven 项目开始。通过引入以下两个主要依赖项来完成基本环境的搭建: ```xml <!-- 核心包 --> <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> ``` 以上依赖定义了 Quartz 的核心组件和支持库,能够满足大多数应用场景的需求[^3]。 #### 3. 并发控制机制 当设计具体的任务逻辑时,可能会面临是否允许多个实例并行运行的选择。Quartz 提供了一种简单的方式来处理这一问题——通过 `@DisallowConcurrentExecution` 注解标记那些不希望被重复调用的任务类[^4]。下面是一个对比示例: - 允许并发的任务实现: ```java public class QuartzJobExecution extends AbstractQuartzJob { @Override protected void doExecute(JobExecutionContext context, QuartzJob job) throws Exception { JobInvokeUtil.invokeMethod(job); } } ``` - 不允许并发的任务实现: ```java @DisallowConcurrentExecution public class QuartzDisallowConcurrentExecution extends AbstractQuartzJob { @Override protected void doExecute(JobExecutionContext context, QuartzJob job) throws Exception { JobInvokeUtil.invokeMethod(job); } } ``` 这种灵活性让开发者可以根据实际业务需求调整任务的行为模式[^4]。 #### 4. UI 辅助工具 除了直接编程外,还可以借助第三方图形界面工具简化管理和监控工作流程。比如 GZY Quartz MUI 就是一款专注于提升用户体验的产品,它不仅适用于 Quartz 自身的功能扩展,还能与其他微服务架构或者事件驱动型系统无缝对接,从而达到集中管控的目的[^2]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值