0
点赞
收藏
分享

微信扫一扫

Java定时任务Quartz之HelloWorld(一)


分布式定时任务Quartz之Hello World(一)

文章目录

  • ​​分布式定时任务Quartz之Hello World(一)​​
  • ​​一、定时任务框架汇总​​
  • ​​二、分布式框架对比​​
  • ​​三、Quartz框架​​
  • ​​四、Quartz初次使用​​
  • ​​4.1. 引入依赖​​
  • ​​4.2. 定义一个简单的`Job`​​
  • ​​4.3. 组装调度器和触发器​​
  • ​​4.4. 执行结果​​
  • ​​五、参考文章:​​

一、定时任务框架汇总

单体架构使用:

  • ​timer:​​​ 底层是使用单线程来处理多个​​Timer​​任务, 所有任务实际上都是串行执行,前一个任务的延迟会影响到之后的任务的执行。 发生未处理的异常之后,所有任务都会停止。尽量不使用!
  • ​ScheduleExecuteSerivce:​​​ 是对​​timer​​缺陷的弥补,支持多个线程并发执行,但是只能根据任务的延迟来进行调度,无法满足基于绝对时间和日历调度的需求。
  • ​Spring Task:​​ 是spring自主开发的轻量级定时任务框架,不需要依赖其他额外的包,配置较为简单。 不支持持久化,无法满足可视化。

分布式框架使用:

  • ​Quartz:​​​ Java领域最著名的开源任务调度工具,也是目前事实上的定时任务标准,几乎全部的开源定时任务框架都是基于​​Quartz​​核心调度构建而成。
  • ​Elastic-Job:​​ 一个分布式调度解决方案,由两个相互独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成。 有些年头没有更新了!
  • ​xxl-job:​​ 一个轻量级分布式任务调度平台,主打特点是平台化,易部署,开发迅速、学习简单、轻量级、易扩展,代码仍在持续更新中。 轻量级神器!

二、分布式框架对比

Java定时任务Quartz之HelloWorld(一)_Quartz

三、Quartz框架

​Java​​​事实上的定时任务标准。但​​Quartz​​​关注点在于定时任务而非数据,并无一套根据数据处理而定制化的流程。虽然​​Quartz​​可以基于数据库实现作业的高可用,但缺少分布式并行调度的功能 。

独立的​​Quratz​​​节点之间是不需要通信的,不同节点之间是通过数据库表来感知另一个应用,只有使用持久的​​JobStore​​​才能完成​​Quartz​​集群。如果某一个节点失效,那么Job会在其他节点上执行。

缺点:

  1. 不适合大量的短任务,不适合过多节点部署;
  2. 解决了高可用的问题,并没有解决任务分片的问题,存在单机处理的极限(即:不能实现水平扩展);
  3. 需要把任务信息持久化到业务数据表,和业务有耦合;
  4. 调度逻辑和执行逻辑并存于同一个项目中,在机器性能固定的情况下,业务和调度之间不可避免地会相互影响;
  5. quartz集群模式下,是通过数据库独占锁来唯一获取任务,任务执行并没有实现完善的负载均衡机制;

四、Quartz初次使用

4.1. 引入依赖

<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>

4.2. 定义一个简单的​​Job​

import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

/**
* @author long
* @version 1.0.0
* @name OneJob.java 普通类
* @description 测试Job,需要定时执行的事情
*/
public class OneJob implements Job {

@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
// 工作内容详情
JobDetail detail = context.getJobDetail();
// 工作名称
String name = detail.getKey().getName();
// 工作分组
String group = detail.getKey().getGroup();
// 工作中的数据
String data = detail.getJobDataMap().getString("data");
System.out.println("Job执行 => Job名称[" + name + "], 分组[" + group + "], 任务数据[" + data + "]");
}
}

4.3. 组装调度器和触发器

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

/**
* @author long
* @version 1.0.0
* @name OneMain.java 普通类
* @description TODO
*/
public class OneMain {

public static void main(String[] args) {
try {
// 创建Scheduler调度器
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
// 定义触发器,设置触发条件
TriggerBuilder triggerBuilder = TriggerBuilder.newTrigger();
// 定义name和分组
Trigger trigger = triggerBuilder.withIdentity("trigger-1", "group-1")
// 加入scheduler,立即生效
.startNow()
// 简单调度器,每隔一秒调度一次
.withSchedule(SimpleScheduleBuilder
.simpleSchedule()
.withIntervalInSeconds(1)
.repeatForever())
.build();
// 定义任务 job
JobDetail job = JobBuilder.newJob(OneJob.class)
.withIdentity("hello-world-任务", "long")
// 传递自定义的属性和数据
.usingJobData("data", "hello world long")
.build();
// 讲任务和触发器加入到调度器中
scheduler.scheduleJob(job, trigger);
// 启动调度器
scheduler.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}

4.4. 执行结果

Java定时任务Quartz之HelloWorld(一)_简单使用_02



举报

相关推荐

0 条评论