当前位置:   article > 正文

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

quarz xxl

目录

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文件中添加以下依赖:

  1. <dependency>
  2. <groupId>org.quartz-scheduler</groupId>
  3. <artifactId>quartz</artifactId>
  4. <version>2.3.2</version>
  5. </dependency>

2. 创建Job类

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

  1. import org.quartz.Job;
  2. import org.quartz.JobExecutionContext;
  3. import org.quartz.JobExecutionException;
  4. public class MyJob implements Job {
  5. @Override
  6. public void execute(JobExecutionContext context) throws JobExecutionException {
  7. System.out.println("Hello Quartz!");
  8. }
  9. }

3. 创建Scheduler类

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

  1. import org.quartz.*;
  2. import org.quartz.impl.StdSchedulerFactory;
  3. import org.quartz.impl.triggers.SimpleTrigger;
  4. public class MyScheduler {
  5. public static void main(String[] args) throws SchedulerException {
  6. // 创建调度器工厂并获取调度器实例
  7. SchedulerFactory schedulerFactory = new StdSchedulerFactory();
  8. Scheduler scheduler = schedulerFactory.getScheduler();
  9. // 启动调度器
  10. scheduler.start();
  11. // 创建任务并注册到调度器中,每5秒钟执行一次
  12. JobDetail jobDetail = JobBuilder.newJob(MyJob.class)
  13. .withIdentity("myJob", "group1")
  14. .build();
  15. Trigger trigger = TriggerBuilder.newTrigger()
  16. .withIdentity("myTrigger", "group1")
  17. .withSchedule(SimpleScheduleBuilder.simpleSchedule()
  18. .withIntervalInSeconds(5)
  19. .repeatForever())
  20. .build();
  21. scheduler.scheduleJob(jobDetail, trigger);
  22. }
  23. }

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编程测试

引入依赖

  1. <dependency>
  2. <groupId>com.xuxueli</groupId>
  3. <artifactId>xxl-job-core</artifactId>
  4. <version>2.3.1</version>
  5. </dependency>

配置application.yml文件

  1. server:
  2. port: 13000
  3. #xxljob的配置
  4. xxl:
  5. job:
  6. admin:
  7. addresses: http://192.168.***.***:9898/xxl-job-admin
  8. executor:
  9. appname: xxl-job-executor-sample
  10. port: 9777
  11. accessToken: default_token
  12. logging:
  13. level:
  14. com.wow: debug

添加Java配置类

  1. package com.wnhz.ssc.job.config;
  2. import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.springframework.beans.factory.annotation.Value;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7. @Slf4j
  8. @Configuration
  9. public class XxlJobConfig {
  10. @Value("${xxl.job.admin.addresses}")
  11. private String address;
  12. @Value("${xxl.job.executor.appname}")
  13. private String appName;
  14. @Value("${xxl.job.executor.port}")
  15. private int port;
  16. @Value("${xxl.job.accessToken}")
  17. private String accessToken;
  18. @Bean
  19. public XxlJobSpringExecutor xxlJobSpringExecutor(){
  20. XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
  21. xxlJobSpringExecutor.setAccessToken(accessToken);
  22. xxlJobSpringExecutor.setAdminAddresses(address);
  23. xxlJobSpringExecutor.setAppname(appName);
  24. xxlJobSpringExecutor.setPort(port);
  25. log.debug("xxl-job已初始化",xxlJobSpringExecutor);
  26. return xxlJobSpringExecutor;
  27. }
  28. }

创建调度任务测试

  1. @Component
  2. @Slf4j
  3. public class MyJobs {
  4. @XxlJob("helloXxl")
  5. public void helloXxlJob(){
  6. log.debug("hello,xxljob");
  7. }
  8. }

web管理端新建任务

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

保存,启动程序测试

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


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

1. java.util.Timerjava.util.TimerTask

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

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

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

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

  1. ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
  2. executor.scheduleAtFixedRate(new Runnable() {
  3. @Override
  4. public void run() {
  5. // 需要执行的任务
  6. }
  7. }, 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博客


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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/201213
推荐阅读
相关标签
  

闽ICP备14008679号