### 定时任务操作Quartz知识点详解 #### 一、Quartz简介 Quartz是一个功能强大的开源作业调度框架,能够实现触发器管理、作业管理、持久化存储等功能,支持多种语言环境,尤其适用于Java应用程序中复杂的定时任务需求。 #### 二、搭建Quartz定时任务系统 在实际开发过程中,Quartz的集成主要涉及数据库表结构的设计、配置文件的编写以及Spring框架下的整合等几个关键步骤。 ##### 1. 数据库表结构设计 根据提供的信息`tables_mysql_innodb.sql`可以推测,这是用来创建MySQL InnoDB类型的数据库表结构的SQL脚本。Quartz提供了默认的数据表结构,开发者也可以自定义数据表,但需要保证与Quartz的数据模型相匹配。这些表主要用于存储作业、触发器、日志等相关信息,为Quartz提供持久化支持。 ##### 2. 配置文件 项目中使用了`spring-quartz.properties`和`spring-quartz.xml`两个配置文件。 - **spring-quartz.properties**:这是一个属性文件,用于配置Quartz的基本属性,如数据源连接信息、线程池配置等。 - **spring-quartz.xml**:这是一个XML配置文件,用于配置具体的定时任务。下面将重点介绍该文件的配置方式。 #### 三、spring-quartz.xml详解 该文件中定义了一个定时任务`ContainerChargeTaskJob`的实现细节,包括作业详情(`JobDetail`)、触发器(`CronTrigger`)以及调度工厂(`SchedulerFactoryBean`)等核心组件。 ```xml <bean id="containerChange" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <property name="jobClass" value="com.cdc.bill.task.ContainerChargeTaskJob"/> <property name="durability" value="true"/> <property name="jobDataAsMap"> <map> <entry key="key" value="containerChargeService"/> </map> </property> </bean> ``` - **JobDetailFactoryBean**:表示一个具体的作业,这里指定了作业类为`ContainerChargeTaskJob`。 - **durability**:设置为`true`表示即使没有触发器绑定到作业上,该作业的实例也会被持久化保存。 - **jobDataAsMap**:用于传递额外的数据到作业中,例如这里的`containerChargeService`。 ```xml <bean id="containerChageTask" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="containerChange"/> <property name="cronExpression" value="0/*5***?"/> </bean> ``` - **CronTriggerFactoryBean**:表示一个基于Cron表达式的触发器。 - **jobDetail**:引用上面定义的`JobDetail`。 - **cronExpression**:定义作业执行的时间规则,此处设置为每5分钟执行一次。 ```xml <bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="dataSource" ref="dataSources"/> <property name="overwriteExistingJobs" value="true"/> <property name="startupDelay" value="30"/> <property name="autoStartup" value="true"/> <property name="applicationContextSchedulerContextKey" value="applicationContextKey"/> <property name="configLocation" value="classpath:spring-quartz.properties"/> <property name="schedulerContextAsMap"> <map> <entry key="containerChargeService" value-ref="containerChargeServiceImpl"/> </map> </property> <property name="triggers"> <list> <ref bean="containerChageTask"/> </list> </property> </bean> ``` - **SchedulerFactoryBean**:负责管理调度器的启动、停止等操作。 - **dataSource**:指定数据源,通常用于持久化存储。 - **overwriteExistingJobs**:设置为`true`表示允许覆盖已存在的作业。 - **startupDelay**:设置调度器启动延迟时间为30秒。 - **autoStartup**:设置为`true`表示启动时自动开启调度器。 - **applicationContextSchedulerContextKey**:设置上下文中的键值,用于后续获取Spring上下文。 - **configLocation**:指定配置文件的位置。 - **schedulerContextAsMap**:用于传递额外的上下文数据,例如这里的`containerChargeServiceImpl`。 - **triggers**:指定触发器列表,用于启动作业。 #### 四、作业实现 根据提供的代码片段,我们可以推断出作业实现类的大致结构: ```java package com.cdc.bill.task; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.SchedulerContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.quartz.QuartzJobBean; public class ContainerChargeTaskJob extends QuartzJobBean { private static final Logger logger = LoggerFactory.getLogger(ContainerChargeTaskJob.class); @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { SchedulerContext schedulerContext = context.getScheduler().getContext(); // 从上下文中获取服务实例并调用相应方法 Object containerChargeService = schedulerContext.get("containerChargeService"); if (containerChargeService != null) { // 执行具体业务逻辑 } else { logger.error("ContainerChargeService is not available."); } } } ``` - **executeInternal**:作业的核心执行逻辑,可以通过`JobExecutionContext`获取上下文数据,并调用相应的服务进行业务处理。 通过以上分析,我们了解到如何使用Quartz结合Spring框架来实现定时任务。从数据库表结构设计到配置文件编写,再到具体的作业实现,每一个环节都非常重要。希望本文能帮助大家更好地理解和应用Quartz定时任务框架。
tables_mysql_innodb.sql
2.添加spring-quartz.properties文件,spring-quartz.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 器具账单明细生成定时任务 -->
<bean id="containerChange"
class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="com.cdc.bill.task.ContainerChargeTaskJob" /> //value为自己添加的类
<property name="durability" value="true" />
<property name="jobDataAsMap">
<map>
<description>jobDataAsMap</description>
<entry key="key" value="containerChargeService" /> //value需要运行的service
</map>
</property>
</bean>
<bean id="containerChageTask"
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="containerChange"></property>
<property name="cronExpression" value="0/* 5 * * * ? "></property>
</bean>
<bean id="schedulerFactoryBean"
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助