Quartz

本文介绍如何在SpringBoot项目中整合Quartz实现定时任务。通过详细配置POM文件,引入@EnableScheduling注解,并创建定时任务类PrintCurrentTimeTask,实现了每5秒执行一次的任务调度。

新建一个SpringBoot项目

 

完整的POM配置文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.fjx</groupId>
    <artifactId>hello-quartz</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>hello-quartz</name>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

启动项中引入@EnableScheduling 注解

package com.fjx.hello.quartz;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@EnableScheduling
@SpringBootApplication
public class HelloQuartzApplication {
    public static void main(String[] args) {
        SpringApplication.run(HelloQuartzApplication.class, args);
    }

}

新建定时任务类PrintCurrentTimeTask

package com.fjx.hello.quartz.controller;/*
 @author 天赋吉运-Jason
 @DESCRIPTION 
 @create 2019-12-25
*/

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;

@Component
public class PrintCurrentTimeTask {
    @Scheduled(cron="0/5 * * * * ? ")
    public void printCurrentTime(){
        System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
    }
}

每隔5秒运行一次 

待续项目中使用!未完,待续!

 

Quartz 是一个功能强大的任务调度框架,广泛应用于企业级应用中,用于处理复杂的任务调度需求。以下是关于 Quartz 的使用指南、配置方法以及问题解决的详细说明。 ### 使用指南 Quartz 提供了多种方式来定义和管理任务。核心组件包括 `Job`(任务)、`Trigger`(触发器)和 `Scheduler`(调度器)。任务的执行逻辑通常通过实现 `Job` 接口来定义,而触发器则决定了任务何时执行。调度器负责管理任务和触发器的生命周期。 以下是一个简单的任务实现示例: ```java import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class SimpleJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("任务正在执行..."); } } ``` 接下来,需要定义一个触发器来指定任务的执行时间。可以使用 `CronTrigger` 来基于 CRON 表达式进行调度: ```java import org.quartz.CronScheduleBuilder; import org.quartz.CronTrigger; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerFactory; import org.quartz.TriggerBuilder; import org.quartz.impl.StdSchedulerFactory; public class QuartzExample { public static void main(String[] args) throws Exception { // 创建任务详情 JobDetail job = JobBuilder.newJob(SimpleJob.class) .withIdentity("simpleJob", "group1") .build(); // 创建触发器,每分钟执行一次 CronTrigger trigger = TriggerBuilder.newTrigger() .withIdentity("cronTrigger", "group1") .withSchedule(CronScheduleBuilder.cronSchedule("0 * * * * ?")) .build(); // 获取调度器并启动 SchedulerFactory schedulerFactory = new StdSchedulerFactory(); Scheduler scheduler = schedulerFactory.getScheduler(); scheduler.start(); // 将任务和触发器注册到调度器 scheduler.scheduleJob(job, trigger); } } ``` ### 配置方法 Quartz 提供了丰富的配置选项,以支持持久化、集群部署和高可用性等高级特性。这些配置通常在 `quartz.properties` 文件中进行设置。 #### 持久化配置 为了确保任务调度的状态在系统重启后仍然保留,可以将 Quartz 配置为使用数据库进行持久化。以下是一个简单的数据库配置示例: ```properties org.quartz.scheduler.instanceName=MyScheduler org.quartz.threadPool.threadCount=3 org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate org.quartz.jobStore.dataSource=myDS org.quartz.dataSource.myDS.driver=com.mysql.cj.jdbc.Driver org.quartz.dataSource.myDS.URL=jdbc:mysql://localhost:3306/quartz org.quartz.dataSource.myDS.user=root org.quartz.dataSource.myDS.password=root org.quartz.dataSource.myDS.maxConnections=5 ``` #### 集群配置 在集群环境中,多个 Quartz 实例可以共享同一个数据库,以实现任务的高可用性和负载均衡。以下是一个集群配置的示例: ```properties org.quartz.scheduler.instanceName=MyClusteredScheduler org.quartz.scheduler.instanceId=AUTO org.quartz.threadPool.threadCount=3 org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate org.quartz.jobStore.dataSource=myDS org.quartz.jobStore.isClustered=true org.quartz.jobStore.clusterCheckinInterval=20000 org.quartz.dataSource.myDS.driver=com.mysql.cj.jdbc.Driver org.quartz.dataSource.myDS.URL=jdbc:mysql://localhost:3306/quartz org.quartz.dataSource.myDS.user=root org.quartz.dataSource.myDS.password=root org.quartz.dataSource.myDS.maxConnections=5 ``` ### 问题解决 在使用 Quartz 时,可能会遇到一些常见问题。以下是一些解决方案和最佳实践: 1. **任务未按预期执行**:检查 CRON 表达式是否正确,并确保调度器已启动。可以通过日志查看调度器的状态和任务的执行情况。 2. **持久化失败**:确保数据库连接配置正确,并且数据库表结构符合 Quartz 的要求。可以使用 Quartz 提供的 SQL 脚本来创建所需的表。 3. **集群节点无法同步**:检查集群节点之间的网络连接,并确保所有节点使用相同的数据库配置。此外,确认 `clusterCheckinInterval` 设置合理,以便节点能够及时更新状态。 4. **任务执行异常**:可以通过实现 `SchedulerListener` 接口来监听任务和触发器的状态变化,并在发生错误时进行处理。以下是一个简单的 `SchedulerListener` 实现示例: ```java import org.quartz.SchedulerListener; import org.quartz.SchedulerException; public class MySchedulerListener implements SchedulerListener { @Override public void jobScheduled(Trigger trigger) { System.out.println("任务已调度: " + trigger.getKey()); } @Override public void jobUnscheduled(String triggerName, String triggerGroup) { System.out.println("任务已取消: " + triggerName + "/" + triggerGroup); } @Override public void triggerFinalized(Trigger trigger) { System.out.println("触发器已最终化: " + trigger.getKey()); } @Override public void triggersPaused(String triggerName, String triggerGroup) { System.out.println("触发器已暂停: " + triggerName + "/" + triggerGroup); } @Override public void triggersResumed(String triggerName, String triggerGroup) { System.out.println("触发器已恢复: " + triggerName + "/" + triggerGroup); } @Override public void jobsPaused(String jobName, String jobGroup) { System.out.println("任务已暂停: " + jobName + "/" + jobGroup); } @Override public void jobsResumed(String jobName, String jobGroup) { System.out.println("任务已恢复: " + jobName + "/" + jobGroup); } @Override public void schedulerError(String msg, SchedulerException cause) { System.out.println("调度器错误: " + msg); cause.printStackTrace(); } @Override public void schedulerStarted() { System.out.println("调度器已启动"); } @Override public void schedulerInStandbyMode() { System.out.println("调度器进入待机模式"); } @Override public void schedulerShutdown() { System.out.println("调度器已关闭"); } @Override public void schedulingDataCleared() { System.out.println("调度数据已清除"); } } ``` 通过以上指南和配置方法,可以有效地使用 Quartz 进行任务调度,并解决可能出现的问题。结合实际业务需求,合理配置持久化和集群选项,并应用安全机制,可以确保任务调度系统的安全、稳定和可靠 [^2]。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值