Java中三种定时任务总结(schedule,quartz,xxl-job)

目录

1、Spring框架的定时任务

2、Quartz

Quartz的用法

3、xxl-job

3.1 docker 安装xxl-job

3.2 xxl-job编程测试

补充:Java中自带的定时任务调度

1. java.util.Timer和java.util.TimerTask

2. java.util.concurrent.Executors和java.util.concurrent.ScheduledExecutorService

小结


1、Spring框架的定时任务

Spring框架提供了强大的定时任务支持。通过使用@Scheduled注解,可以将一个方法标记为定时任务,并指定任务的执行时间规则。可以设置任务在固定的时间点执行,也可以设置任务在一定的时间间隔内重复执行。Spring的定时任务功能更加灵活,支持各种时间表达式,也可以配置多线程执行任务。

  1. Spring @Scheduled注解:这是一个基于Spring框架的应用程序,并通过Spring提供的@Scheduled注解来非常简便地实现定时任务。只需在方法上添加@Scheduled注解,并指定一个cron表达式,就可以在指定的时间执行该方法。
  2. Spring Boot @Scheduled注解:在Spring Boot框架中,也可以使用@Scheduled注解来创建定时任务。Spring Boot还提供了一个自动配置的Scheduler,使得创建和配置定时任务变得非常简单。

2、Quartz

Quartz是一个由Java编写的开源作业调度框架,它允许与J2EE和J2SE应用程序相结合,也可以单独使用。Quartz可以用来创建简单或复杂的程序,包括运行十个、百个甚至上万个Jobs。这些Jobs可以做成标准的Java组件或EJBs。Quartz支持丰富的调度策略,例如支持多线程、优先级、异常处理等。

详情可见以下地址:

Quartz Enterprise Job Scheduler

java 调度框架 java任务调度框架有哪些_mob64ca140fd7c1的技术博客_51CTO博客

Java任务调度框架Quartz教程-腾讯云开发者社区-腾讯云

Quartz的核心概念包括Job、JobDetail和Trigger等。Job表示一个工作,包含要执行的具体内容,其接口中只有一个方法。JobDetail表示一个具体的可执行的调度程序,包含了这个任务调度的方案和策略。Trigger代表一个调度参数的配置,定义了何时去调度。Scheduler则是代表一个调度容器,一个调度容器中可以注册多个JobDetail和Trigger,当Trigger与JobDetail组合时,就可以被Scheduler容器调度了。

  1. 作业(Job):表示一个要执行的任务或工作单元。根据具体需求,可以自定义实现 org.quartz.Job 接口或继承 org.quartz.InterruptableJob 接口,并实现 execute() 方法来定义任务的执行逻辑。

  2. 任务(Task):是作业的实例,即具体要执行的任务对象。每次作业被触发时,都会创建一个新的任务实例。

  3. 触发器(Trigger):定义作业何时触发执行的条件。Quartz 提供了多种触发器类型,如简单触发器 SimpleTrigger、日历触发器 CalendarTrigger 和 Cron 触发器 CronTrigger 等。通过配置触发器的属性,如触发时间、重复间隔等,可以灵活地定义作业的触发规则。

  4. 调度器(Scheduler):是 Quartz 的核心组件,负责管理和协调作业的调度和执行。调度器可以启动、停止和暂停作业的执行,并根据触发器的配置规则触发作业执行。

  5. 上下文(Context):提供了在作业执行期间访问调度器和其他环境信息的方式。作业实例可以通过上下文对象获取调度器、触发器和其他相关信息。

  6. 监听器(Listener):用于监听作业和触发器的事件,如作业执行前后、触发器触发前后等。通过实现监听器接口,可以在特定事件发生时执行自定义的逻辑。

  7. 任务存储(JobStore):Quartz 使用任务存储来持久化作业和触发器的状态信息,以便在应用重启后能够恢复调度任务。Quartz 提供了多种任务存储实现,包括内存存储、数据库存储和集群存储等。

Quartz的使用非常灵活。比如,可以配置一个Job实现类并设定好调度时间表,Quartz就会密切注意剩余时间,当调度程序确定该是通知作业的时候,Quartz框架就会调用Job实现类(作业类)上的execute()方法并允许做它该做的事情。这个过程无需报告任何东西给调度器或调用任何特定的东西,Quartz会执行任务并结束任务。如果配置作业在随后再次被调用,Quartz框架也将在恰当的时间再次调用它。

Quartz的内部架构大约包含300个Java类和接口,并被组织到12个包中。尽管规模几乎不会用来作为衡量框架质量的一个特性,但这里的关键是quartz内含很多功能,这些功能和特性集是否成为、或者应该成为评判一个开源或非开源框架质量的因素。

Quartz的用法

1. 添加Quartz依赖

首先需要在项目中添加Quartz的依赖。如果你使用Maven,可以在pom.xml文件中添加以下依赖:

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

2. 创建Job类

创建一个简单的Job类,该类实现了Quartz的Job接口,并覆盖了execute方法。在这个例子中,我们将输出“Hello Quartz!”到控制台。

import org.quartz.Job;  
import org.quartz.JobExecutionContext;  
import org.quartz.JobExecutionException;  public class MyJob implements Job {  @Override  public void execute(JobExecutionContext context) throws JobExecutionException {  System.out.println("Hello Quartz!");  }  
}

3. 创建Scheduler类

创建一个Scheduler类,该类负责配置Quartz并启动调度器。在这个例子中,我们将创建一个简单的调度器,并注册一个任务(MyJob)来每5秒钟执行一次。

import org.quartz.*;  
import org.quartz.impl.StdSchedulerFactory;  
import org.quartz.impl.triggers.SimpleTrigger;  public class MyScheduler {  public static void main(String[] args) throws SchedulerException {  // 创建调度器工厂并获取调度器实例  SchedulerFactory schedulerFactory = new StdSchedulerFactory();  Scheduler scheduler = schedulerFactory.getScheduler();  // 启动调度器  scheduler.start();  // 创建任务并注册到调度器中,每5秒钟执行一次  JobDetail jobDetail = JobBuilder.newJob(MyJob.class)  .withIdentity("myJob", "group1")  .build();  Trigger trigger = TriggerBuilder.newTrigger()  .withIdentity("myTrigger", "group1")  .withSchedule(SimpleScheduleBuilder.simpleSchedule()  .withIntervalInSeconds(5)  .repeatForever())  .build();  scheduler.scheduleJob(jobDetail, trigger);  }  
}

3、xxl-job

官方网站及文档:

分布式任务调度平台XXL-JOB

GitHub - xuxueli/xxl-job: A distributed task scheduling framework.(分布式任务调度平台XXL-JOB)

xxl-job 是一个分布式任务调度平台,它的核心部分包括以下几个方面:

  1. 调度中心(JobAdmin):负责任务的管理和调度,包括任务的创建、编辑、删除,以及任务的调度策略配置等。调度中心还负责监控任务的执行情况,并提供任务日志查询和报警功能。

  2. 执行器(JobExecutor):负责具体的任务执行。执行器在分布式环境中部署在各个节点上,通过与调度中心进行通信,接收调度中心分配的任务,并执行任务逻辑。执行器还负责任务的报警和日志上报等功能。

  3. 调度模型:xxl-job 提供了多种调度模型,包括固定间隔触发、Cron 表达式触发、API 触发等。用户可以根据自己的需求选择合适的调度模型来触发任务的执行。

  4. 任务路由策略:xxl-job 支持多种任务路由策略,包括轮询、一致性哈希、故障转移等。任务路由策略决定了任务在分布式环境下的执行节点选择方式,保证任务的高可用性和负载均衡。

  5. 监控和报警:xxl-job 提供了丰富的监控指标和报警机制,可以实时监控任务的执行情况,包括任务的成功、失败、运行时间等指标。同时,xxl-job 还支持邮件、短信等方式进行任务执行状态的报警通知。

  6. 可视化管理界面:xxl-job 提供了友好的可视化管理界面,方便用户进行任务的配置和管理,同时也提供了任务执行日志查询、任务执行情况统计等功能。通过强大的调度中心和执行器,提供了可靠的任务调度功能和高效的分布式任务执行能力,帮助用户实现任务的自动化调度和管理。

3.1 docker 安装xxl-job

查询并拉取镜像

查询:docker search xuxueli

选择并拉取该镜像:docker pull xuxueli/xxl-job-admin:2.3.1(可自选版本)

配置docker-compose.yml文件

version: '2'
#自定义的docker网络
networks:
  docker_net:
    external: true
services:
  xxl-job-compose:
    #读取docker-compose/Dockerfile的位置
    build: .
    #镜像名称
    image: xuxueli/xxl-job-admin:2.3.1
    #容器名称
    container_name: xxl-job
    ports:
      - "9898:8080"
    environment:
      PARAMS: '--spring.datasource.url=jdbc:mysql://192.168.***.***:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
               --spring.datasource.username=root
               --spring.datasource.password=123'
    volumes:
      - /usr/local/software/xxl-job/log:/data/applogs
    networks:
      docker_net:
        ipv4_address: 172.18.12.100

加载数据库

后台运行创建xxl-job容器

docker-compose up -d

进入xxl-job网页

3.2 xxl-job编程测试

引入依赖

        <dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>2.3.1</version></dependency>

配置application.yml文件

server:port: 13000
#xxljob的配置
xxl:job:admin:addresses: http://192.168.***.***:9898/xxl-job-adminexecutor:appname: xxl-job-executor-sampleport: 9777accessToken: default_tokenlogging:level:com.wow: debug

添加Java配置类

package com.wnhz.ssc.job.config;import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Slf4j
@Configuration
public class XxlJobConfig {@Value("${xxl.job.admin.addresses}")private String address;@Value("${xxl.job.executor.appname}")private String appName;@Value("${xxl.job.executor.port}")private int port;@Value("${xxl.job.accessToken}")private String accessToken;@Beanpublic XxlJobSpringExecutor xxlJobSpringExecutor(){XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();xxlJobSpringExecutor.setAccessToken(accessToken);xxlJobSpringExecutor.setAdminAddresses(address);xxlJobSpringExecutor.setAppname(appName);xxlJobSpringExecutor.setPort(port);log.debug("xxl-job已初始化",xxlJobSpringExecutor);return xxlJobSpringExecutor;}
}

创建调度任务测试

@Component
@Slf4j
public class MyJobs {@XxlJob("helloXxl")public void helloXxlJob(){log.debug("hello,xxljob");}
}

web管理端新建任务

注意:JobHandler需与代码中的调度名称一致!

保存,启动程序测试

控制台查看或者web端查看调度日志


补充:Java中自带的定时任务调度

1. java.util.Timerjava.util.TimerTask

这是Java标准库提供的定时任务工具类。Timer类用于创建定时器,并可以调度TimerTask类的任务执行。通过调用schedule()方法,可以指定任务在未来的某个时间点执行,也可以指定任务在一定的时间间隔内重复执行。

Timer timer = new Timer();  
timer.schedule(new TimerTask() {  @Override  public void run() {  // 需要执行的任务  }  
}, 0, 1000);  // 任务延迟0毫秒后开始,每隔1000毫秒执行一次

2. java.util.concurrent.Executorsjava.util.concurrent.ScheduledExecutorService

这是Java并发包提供的定时任务框架,是Java 5及以上版本中提供的一个更强大的定时任务调度器,相比于Timer类,它提供了更灵活的调度策略,例如支持固定延迟、固定速率、周期性调度等。

ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);  
executor.scheduleAtFixedRate(new Runnable() {  @Override  public void run() {  // 需要执行的任务  }  
}, 0, 1, TimeUnit.SECONDS);  // 任务延迟0秒后开始,每隔1秒执行一次

ScheduledExecutorService接口继承自ExecutorService接口,可以支持延迟执行和周期性执行任务。通过schedule()方法,可以指定任务在未来的某个时间点执行。通过scheduleAtFixedRate()方法或scheduleWithFixedDelay()方法,可以指定任务在一定的时间间隔内重复执行。

图片来源:【任务调度框架】「分析技术指南」带你一同盘点一下常用的任务调度框架的方案和原理开发指南_任务调度详细介绍-CSDN博客

如果只是简单的定时任务需求,使用java.util.Timerjava.util.TimerTask就足够了;如果需要更强大的定时任务功能,可以选择使用java.util.concurrent.ScheduledExecutorService。


小结

定时任务特点所属类型
Timer (Java Platform SE 8 )定时任务框架,非线程安全,如任务执行时间过长,会影响后续任务的执行。 Java自带
ScheduledExecutorService (Java Platform SE 8 )Java自带的定时任务框架,提供了更多的功能和灵活性,并且是线程安全。 Java自带
Quartz是一个全功能、开源的任务调度服务,可以集成几乎任何的java应用程序—从小的单片机系统到大型的电子商务系统。Quartz可以执行上千上万的任务调度。开源的
Spring TaskSpring框架自带的通过@Scheduled注解使用Spring框架自带
分布式任务调度平台XXL-JOB

XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。

分布式

参考

【任务调度框架】「分析技术指南」带你一同盘点一下常用的任务调度框架的方案和原理开发指南_任务调度详细介绍-CSDN博客

java定时任务调度框架 - pluto_charon - 博客园

Java任务调度框架Quartz教程-腾讯云开发者社区-腾讯云

java 调度框架 java任务调度框架有哪些_mob64ca140fd7c1的技术博客_51CTO博客


感谢阅读,码字不易,多谢点赞!如有不当之处,欢迎反馈指出,感谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/247346.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ai绘画Midjourney绘画提示词Prompt教程

一、Midjourney绘画工具 SparkAi【无需魔法使用】&#xff1a; SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧&#xff01;本系统使用NestjsVueTypescript框架技术&#xff0c;持续集成AI能力到…

MySQL笔记-第01章_数据库概述

视频链接&#xff1a;【MySQL数据库入门到大牛&#xff0c;mysql安装到优化&#xff0c;百科全书级&#xff0c;全网天花板】 文章目录 第01章_数据库概述1. 为什么要使用数据库2. 数据库与数据库管理系统2.1 数据库的相关概念2.2 数据库与数据库管理系统的关系2.3 常见的数据库…

IoT DC3 是一个基于 Spring Cloud 全开源物联网平台 linux docker部署傻瓜化步骤

如有不了解可先参考我的另一篇文章本地部署:IoT DC3 是一个基于 Spring Cloud 的开源的、分布式的物联网(IoT)平台本地部署步骤 如有不了解可先参考我的另一篇文章本地部署: 1 环境准备: JDK 8 以上 docker 安装好 下载docker-compose-dev.yml 文件 执行基础环境docker安装 …

EM32DX-E4【C#】

1外观&#xff1a; ecat总线&#xff0c;分布式io 2电源&#xff1a; 靠近SW拨码&#xff1a;24V 中间&#xff1a;0V 靠近面板&#xff1a;PE接地 3DI&#xff1a; 6000H DI输入寄存器 16-bit &#xff08;16位输入&#xff09; 00H U8 子索引总数 01H Unsigned16 IN1…

如何用JS实现模糊查询功能

我是写的是JSON数据通过请求来获取&#xff0c;实现这个模糊查询功能我只用了indexOf返回数组下标这一种办法。方法不限&#xff0c;下面我只展示这一种方法喽&#xff01; indexOf是什么 indexOf是返回指定内容在原字符串中的位置&#xff0c;该方法是从数组的start处或数组的…

【PCB知识】

PCB知识 1. PCB知识1.1 扩展名1.21.31.4 2.3.4.5. 1. PCB知识 1.1 扩展名 扩展名为 *.opj 的文件可以使用 Origin Project 应用程序打开。 扩展名为*.DSN文件&#xff0c;一般为isis或OrCAD电路图文件&#xff0c; OrCAD为Cadence软件组件&#xff1b; isis为Proteus软件的sc…

字符串经典基础面试题

关卡名 字符串经典基础面试题 我会了✔️ 内容 1.理解字符串反转的处理方法 ✔️ 2.熟练掌握回文串的判断方法 ✔️ 3.掌握字符串中搜索第一个唯一字符的方法 ✔️ 4.掌握判断是否互为字符串重排的处理技巧 ✔️ 1 反转的问题 我们知道反转是链表的一个重要考点&#xf…

侯捷C++八部曲(一,面向对象)

头文件和类的声明 inline inline修饰函数&#xff0c;是给编译器的一个建议&#xff0c;到底是否为inline由编译器来决定&#xff0c;inline修饰的函数在使用时是做简单的替换&#xff0c;这样就避免了一些函数栈空间的使用&#xff0c;从能提升效率。从另一种角度看&#xff…

TI 毫米波雷达器件中的自校准功能(TI文档)

摘要 TI 的毫米波雷达传感器包括一个内部处理器和硬件架构&#xff0c;支持自校准和监控。校准可确保在温度和工艺变化范围内维持雷达前端的性能。监控可以周期性测量射频/模拟性能参数并检测潜在故障。 本应用手册简要介绍了校准和监控机制&#xff0c;主要侧重于内部…

香港虚拟信用卡如何办理,支持香港apple id

什么是虚拟信用卡&#xff1f; 虚拟信用卡&#xff0c;英文称之为Virtual Credit Card Numbers&#xff0c;就是指没有实体卡片&#xff0c;是基于银行卡上面的BIN码所生成的虚拟账号。通常用于进行网络交易&#xff0c;使用起来很方便&#xff0c;也很安全。 它与实体信用卡…

Redis系列之incr和decr命令是线程安全的?

Redis是一个单线程的服务&#xff0c;所以正常来说redis的命令是会排队执行的。incr/decr命令是redis提供的可以实现递增递减的命令&#xff0c;所以这两个命令也是具有原子性的&#xff1f;是线程安全的&#xff1f;这个也是互联网公司面试的常见题&#xff0c;话不多说&#…

AGI智能新时代,大模型为软件开发带来范式变革

导语 | 人工智能作为新一轮科技革命和产业变革的重要驱动力量&#xff0c;尤其是在当下新一轮 AI 大模型、生成式 AI 浪潮背景下&#xff0c;重视通用人工智能&#xff08;AGI&#xff09;成为行业的共识。在当前&#xff0c; AGI 技术背后的逻辑究竟是怎样的&#xff1f;技术创…