目录
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
小结
Spring框架提供了强大的定时任务支持。通过使用@Scheduled
注解,可以将一个方法标记为定时任务,并指定任务的执行时间规则。可以设置任务在固定的时间点执行,也可以设置任务在一定的时间间隔内重复执行。Spring的定时任务功能更加灵活,支持各种时间表达式,也可以配置多线程执行任务。
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容器调度了。
作业(Job):表示一个要执行的任务或工作单元。根据具体需求,可以自定义实现
org.quartz.Job
接口或继承org.quartz.InterruptableJob
接口,并实现execute()
方法来定义任务的执行逻辑。任务(Task):是作业的实例,即具体要执行的任务对象。每次作业被触发时,都会创建一个新的任务实例。
触发器(Trigger):定义作业何时触发执行的条件。Quartz 提供了多种触发器类型,如简单触发器
SimpleTrigger
、日历触发器CalendarTrigger
和 Cron 触发器CronTrigger
等。通过配置触发器的属性,如触发时间、重复间隔等,可以灵活地定义作业的触发规则。调度器(Scheduler):是 Quartz 的核心组件,负责管理和协调作业的调度和执行。调度器可以启动、停止和暂停作业的执行,并根据触发器的配置规则触发作业执行。
上下文(Context):提供了在作业执行期间访问调度器和其他环境信息的方式。作业实例可以通过上下文对象获取调度器、触发器和其他相关信息。
监听器(Listener):用于监听作业和触发器的事件,如作业执行前后、触发器触发前后等。通过实现监听器接口,可以在特定事件发生时执行自定义的逻辑。
任务存储(JobStore):Quartz 使用任务存储来持久化作业和触发器的状态信息,以便在应用重启后能够恢复调度任务。Quartz 提供了多种任务存储实现,包括内存存储、数据库存储和集群存储等。
Quartz的使用非常灵活。比如,可以配置一个Job实现类并设定好调度时间表,Quartz就会密切注意剩余时间,当调度程序确定该是通知作业的时候,Quartz框架就会调用Job实现类(作业类)上的execute()方法并允许做它该做的事情。这个过程无需报告任何东西给调度器或调用任何特定的东西,Quartz会执行任务并结束任务。如果配置作业在随后再次被调用,Quartz框架也将在恰当的时间再次调用它。
Quartz的内部架构大约包含300个Java类和接口,并被组织到12个包中。尽管规模几乎不会用来作为衡量框架质量的一个特性,但这里的关键是quartz内含很多功能,这些功能和特性集是否成为、或者应该成为评判一个开源或非开源框架质量的因素。
1. 添加Quartz依赖
首先需要在项目中添加Quartz的依赖。如果你使用Maven,可以在pom.xml文件中添加以下依赖:
org.quartz-scheduler
quartz
2.3.2
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);
}
}
官方网站及文档:
分布式任务调度平台XXL-JOB
GitHub - xuxueli/xxl-job: A distributed task scheduling framework.(分布式任务调度平台XXL-JOB)
xxl-job 是一个分布式任务调度平台,它的核心部分包括以下几个方面:
调度中心(JobAdmin):负责任务的管理和调度,包括任务的创建、编辑、删除,以及任务的调度策略配置等。调度中心还负责监控任务的执行情况,并提供任务日志查询和报警功能。
执行器(JobExecutor):负责具体的任务执行。执行器在分布式环境中部署在各个节点上,通过与调度中心进行通信,接收调度中心分配的任务,并执行任务逻辑。执行器还负责任务的报警和日志上报等功能。
调度模型:xxl-job 提供了多种调度模型,包括固定间隔触发、Cron 表达式触发、API 触发等。用户可以根据自己的需求选择合适的调度模型来触发任务的执行。
任务路由策略:xxl-job 支持多种任务路由策略,包括轮询、一致性哈希、故障转移等。任务路由策略决定了任务在分布式环境下的执行节点选择方式,保证任务的高可用性和负载均衡。
监控和报警:xxl-job 提供了丰富的监控指标和报警机制,可以实时监控任务的执行情况,包括任务的成功、失败、运行时间等指标。同时,xxl-job 还支持邮件、短信等方式进行任务执行状态的报警通知。
可视化管理界面: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网页
引入依赖
com.xuxueli
xxl-job-core
2.3.1
配置application.yml文件
server:
port: 13000
#xxljob的配置
xxl:
job:
admin:
addresses: http://192.168.***.***:9898/xxl-job-admin
executor:
appname: xxl-job-executor-sample
port: 9777
accessToken: default_token
logging:
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;
@Bean
public 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端查看调度日志
1. java.util.Timer
和java.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.Executors
和java.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.Timer
和java.util.TimerTask
就足够了;如果需要更强大的定时任务功能,可以选择使用java.util.concurrent.ScheduledExecutorService。
定时任务 | 特点 | 所属类型 |
Timer (Java Platform SE 8 ) | 定时任务框架,非线程安全,如任务执行时间过长,会影响后续任务的执行。 | Java自带 |
ScheduledExecutorService (Java Platform SE 8 ) | Java自带的定时任务框架,提供了更多的功能和灵活性,并且是线程安全。 | Java自带 |
Quartz | 是一个全功能、开源的任务调度服务,可以集成几乎任何的java应用程序—从小的单片机系统到大型的电子商务系统。Quartz可以执行上千上万的任务调度。 | 开源的 |
Spring Task | Spring框架自带的通过@Scheduled注解使用 | Spring框架自带 |
分布式任务调度平台XXL-JOB | XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。 |
分布式 |
参考
【任务调度框架】「分析技术指南」带你一同盘点一下常用的任务调度框架的方案和原理开发指南_任务调度详细介绍-CSDN博客
java定时任务调度框架 - pluto_charon - 博客园
Java任务调度框架Quartz教程-腾讯云开发者社区-腾讯云
java 调度框架 java任务调度框架有哪些_mob64ca140fd7c1的技术博客_51CTO博客
感谢阅读,码字不易,多谢点赞!如有不当之处,欢迎反馈指出,感谢!